Browse Source

If the user passes in "" as the string to resolve the lstat() will

fail anyway so check for that.  Also convert "." to "" since that
way we avoid the lstat() (which we don't need) and the subsequent
chdir() and some dir checks.
OPENBSD_3_1
millert 23 years ago
parent
commit
b6c954318e
1 changed files with 6 additions and 2 deletions
  1. +6
    -2
      src/lib/libc/stdlib/realpath.c

+ 6
- 2
src/lib/libc/stdlib/realpath.c View File

@ -35,7 +35,7 @@
*/ */
#if defined(LIBC_SCCS) && !defined(lint) #if defined(LIBC_SCCS) && !defined(lint)
static char *rcsid = "$OpenBSD: realpath.c,v 1.5 2001/06/27 00:58:56 lebel Exp $";
static char *rcsid = "$OpenBSD: realpath.c,v 1.6 2002/01/12 16:24:35 millert Exp $";
#endif /* LIBC_SCCS and not lint */ #endif /* LIBC_SCCS and not lint */
#include <sys/param.h> #include <sys/param.h>
@ -70,6 +70,10 @@ realpath(path, resolved)
return (NULL); return (NULL);
} }
/* Convert "." -> "" to optimize away a needless lstat() and chdir() */
if (path[0] == '.' && path[1] == '\0')
path = "";
/* /*
* Find the dirname and basename from the path to be resolved. * Find the dirname and basename from the path to be resolved.
* Change directory to the dirname component. * Change directory to the dirname component.
@ -98,7 +102,7 @@ loop:
p = resolved; p = resolved;
/* Deal with the last component. */ /* Deal with the last component. */
if (lstat(p, &sb) == 0) {
if (*p != '\0' && lstat(p, &sb) == 0) {
if (S_ISLNK(sb.st_mode)) { if (S_ISLNK(sb.st_mode)) {
if (++symlinks > MAXSYMLINKS) { if (++symlinks > MAXSYMLINKS) {
errno = ELOOP; errno = ELOOP;


Loading…
Cancel
Save