]> granicus.if.org Git - sudo/commitdiff
for those w/o this in libc
authorTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 6 Jun 1994 00:04:06 +0000 (00:04 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 6 Jun 1994 00:04:06 +0000 (00:04 +0000)
realpath.c
sudo_realpath.c

index 1e04746054d8fec5c552ef99f11bdbdac6c19ff0..cc96d7a3a0d788dd6efd2dd816fae9561cfdd2f4 100644 (file)
@@ -104,7 +104,8 @@ char * realpath(old, new)
      * Resolve the last component of the path if it is a link
      * until it is a non-link.
      */
-    while ((statbuf.st_mode & _S_IFMT) == _S_IFLNK) {
+    errno = 0;
+    while (!lstat(new, &statbuf) && (statbuf.st_mode & _S_IFMT) == _S_IFLNK) {
        /* it's a link */
 
        if ((len = readlink(new, buf, sizeof(buf))) <= 0)
@@ -130,6 +131,10 @@ char * realpath(old, new)
        }
     }
 
+    /* did an lstat() fail? */
+    if (errno)
+       return(realpath_ret(NULL, cwd));
+
     /*
      * separate the last component from the rest of the path
      * so we can do a getcwd() safely.
@@ -155,7 +160,7 @@ char * realpath(old, new)
     /* append "/" and buf to new but watch for double '/' */
     len = strlen(new);
     if (len) {
-       temp = new + len;
+       temp = new + len - 1;
        if (*temp != '/') {
            *(++temp) = '/';
            *(++temp) = '\0';
index 1e04746054d8fec5c552ef99f11bdbdac6c19ff0..cc96d7a3a0d788dd6efd2dd816fae9561cfdd2f4 100644 (file)
@@ -104,7 +104,8 @@ char * realpath(old, new)
      * Resolve the last component of the path if it is a link
      * until it is a non-link.
      */
-    while ((statbuf.st_mode & _S_IFMT) == _S_IFLNK) {
+    errno = 0;
+    while (!lstat(new, &statbuf) && (statbuf.st_mode & _S_IFMT) == _S_IFLNK) {
        /* it's a link */
 
        if ((len = readlink(new, buf, sizeof(buf))) <= 0)
@@ -130,6 +131,10 @@ char * realpath(old, new)
        }
     }
 
+    /* did an lstat() fail? */
+    if (errno)
+       return(realpath_ret(NULL, cwd));
+
     /*
      * separate the last component from the rest of the path
      * so we can do a getcwd() safely.
@@ -155,7 +160,7 @@ char * realpath(old, new)
     /* append "/" and buf to new but watch for double '/' */
     len = strlen(new);
     if (len) {
-       temp = new + len;
+       temp = new + len - 1;
        if (*temp != '/') {
            *(++temp) = '/';
            *(++temp) = '\0';