ChorusOS 4.0 Migration Guide

3.1 strsep()

It is no longer possible to modify string constants in the ChorusOS 4.0 operating system. As a result, the strsep() function will cause a segmentation fault if called with a pointer to a literal string. This is demonstrated in Example 3-1.


Example 3-1 Code example of strsep() causing a segmentation fault

int main(int argc, char **argv)
{
    char *s = "aaaa/bbbb";
    char *r;
    char **sp = &s;

    r = strsep(sp, "/"); /* a segmentation fault is raised */
}                

Example 3-1 does not cause a segmentation fault in the ChorusOS 3.2 operating system because the gcc .rodata section was mapped to a writable memory region. In the ChorusOS 4.0 operating system, the gcc .rodata section is mapped to a read-only memory region.

Example 3-1 can be corrected by calling strsep() with a non-literal string, shown in Example 3-2.


Example 3-2 Corrected code example using strsep()

int main(int argc, char **argv)
{
    char *s = "aaaa/bbbb";
    char *r;
    char **sp = &s;
    char *tmp;

    tmp = strdup(s);

    if (tmp == NULL) {
        printf("out of memory\n");
        return 0;
    }

    sp = &tmp;
    r = strsep(sp, "/"); /* this works */
} 

See the strsep(3STDC) man page for more information.