version 1.25.2.2, 2004/05/11 12:23:04 |
version 1.32, 2003/08/07 16:42:49 |
|
|
* 2. Redistributions in binary form must reproduce the above copyright |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* 3. Neither the name of the University nor the names of its contributors |
* must display the following acknowledgement: |
|
* This product includes software developed by the University of |
|
* California, Berkeley and its contributors. |
|
* 4. Neither the name of the University nor the names of its contributors |
|
* may be used to endorse or promote products derived from this software |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* without specific prior written permission. |
* |
* |
Line 95 realpath(path, resolved) |
|
Line 91 realpath(path, resolved) |
|
|
|
/* Save the starting point. */ |
/* Save the starting point. */ |
if ((fd = open(".", O_RDONLY)) < 0) { |
if ((fd = open(".", O_RDONLY)) < 0) { |
(void)strcpy(resolved, "."); |
(void)strlcpy(resolved, ".", MAXPATHLEN); |
return (NULL); |
return (NULL); |
} |
} |
|
|
Line 107 realpath(path, resolved) |
|
Line 103 realpath(path, resolved) |
|
* if it is a directory, then change to that directory. |
* if it is a directory, then change to that directory. |
* get the current directory name and append the basename. |
* get the current directory name and append the basename. |
*/ |
*/ |
(void)strncpy(resolved, path, MAXPATHLEN - 1); |
if (strlcpy(resolved, path, MAXPATHLEN) >= MAXPATHLEN) { |
resolved[MAXPATHLEN - 1] = '\0'; |
errno = ENAMETOOLONG; |
|
goto err1; |
|
} |
loop: |
loop: |
q = strrchr(resolved, '/'); |
q = strrchr(resolved, '/'); |
if (q != NULL) { |
if (q != NULL) { |
|
|
* Save the last component name and get the full pathname of |
* Save the last component name and get the full pathname of |
* the current directory. |
* the current directory. |
*/ |
*/ |
(void)strlcpy(wbuf, p, sizeof(wbuf)); |
if (strlcpy(wbuf, p, sizeof(wbuf)) >= sizeof(wbuf)) { |
|
errno = ENAMETOOLONG; |
|
goto err1; |
|
} |
|
|
/* |
/* |
* Call the inernal internal version of getcwd which |
* Call the inernal internal version of getcwd which |
|
|
goto err1; |
goto err1; |
} |
} |
if (rootd == 0) |
if (rootd == 0) |
(void)strcat(resolved, "/"); /* XXX: strcat is safe */ |
if (strlcat(resolved, "/", MAXPATHLEN) >= MAXPATHLEN) { |
(void)strcat(resolved, wbuf); /* XXX: strcat is safe */ |
errno = ENAMETOOLONG; |
|
goto err1; |
|
} |
|
if (strlcat(resolved, wbuf, MAXPATHLEN) >= MAXPATHLEN) { |
|
errno = ENAMETOOLONG; |
|
goto err1; |
|
} |
} |
} |
|
|
/* Go back to where we came from. */ |
/* Go back to where we came from. */ |