Subversion Repositories HelenOS

Rev

Rev 3255 | Rev 3313 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3255 Rev 3292
Line 60... Line 60...
60
size_t cwd_len = 0;
60
size_t cwd_len = 0;
61
 
61
 
62
static char *absolutize(const char *path, size_t *retlen)
62
static char *absolutize(const char *path, size_t *retlen)
63
{
63
{
64
    char *ncwd_path;
64
    char *ncwd_path;
-
 
65
    char *ncwd_path_nc;
65
 
66
 
66
    futex_down(&cwd_futex);
67
    futex_down(&cwd_futex);
67
    size_t len = strlen(path);
68
    size_t len = strlen(path);
68
    if (*path != '/') {
69
    if (*path != '/') {
69
        if (!cwd_path) {
70
        if (!cwd_path) {
70
            futex_up(&cwd_futex);
71
            futex_up(&cwd_futex);
71
            return NULL;
72
            return NULL;
72
        }
73
        }
73
        ncwd_path = malloc(len + cwd_len + 1);
74
        ncwd_path_nc = malloc(len + cwd_len + 1);
74
        if (!ncwd_path) {
75
        if (!ncwd_path_nc) {
75
            futex_up(&cwd_futex);
76
            futex_up(&cwd_futex);
76
            return NULL;
77
            return NULL;
77
        }
78
        }
78
        strcpy(ncwd_path, cwd_path);
79
        strcpy(ncwd_path_nc, cwd_path);
79
        ncwd_path[cwd_len] = '/';
80
        ncwd_path_nc[cwd_len] = '/';
80
        ncwd_path[cwd_len + 1] = '\0';
81
        ncwd_path_nc[cwd_len + 1] = '\0';
81
    } else {
82
    } else {
82
        ncwd_path = malloc(len + 1);
83
        ncwd_path_nc = malloc(len + 1);
83
        if (!ncwd_path) {
84
        if (!ncwd_path_nc) {
84
            futex_up(&cwd_futex);
85
            futex_up(&cwd_futex);
85
            return NULL;
86
            return NULL;
86
        }
87
        }
87
        ncwd_path[0] = '\0';
88
        ncwd_path_nc[0] = '\0';
88
    }
89
    }
89
    strcat(ncwd_path, path);
90
    strcat(ncwd_path_nc, path);
90
    if (!canonify(ncwd_path, retlen)) {
91
    ncwd_path = canonify(ncwd_path_nc, retlen);
-
 
92
    if (!ncwd_path) {
-
 
93
        futex_up(&cwd_futex);
-
 
94
        free(ncwd_path_nc);
-
 
95
        return NULL;
-
 
96
    }
-
 
97
    /*
-
 
98
     * We need to clone ncwd_path because canonify() works in-place and thus
-
 
99
     * the address in ncwd_path need not be the same as ncwd_path_nc, even
-
 
100
     * though they both point into the same dynamically allocated buffer.
-
 
101
     */
-
 
102
    ncwd_path = strdup(ncwd_path);
-
 
103
    free(ncwd_path_nc);
-
 
104
    if (!ncwd_path) {
91
        futex_up(&cwd_futex);
105
        futex_up(&cwd_futex);
92
        free(ncwd_path);
-
 
93
        return NULL;
106
        return NULL;
94
    }
107
    }
95
    futex_up(&cwd_futex);
108
    futex_up(&cwd_futex);
96
    return ncwd_path;
109
    return ncwd_path;
97
}
110
}