svn commit: r269890 - stable/9/lib/libc/stdlib

Jilles Tjoelker jilles at FreeBSD.org
Tue Aug 12 19:57:12 UTC 2014


Author: jilles
Date: Tue Aug 12 19:57:12 2014
New Revision: 269890
URL: http://svnweb.freebsd.org/changeset/base/269890

Log:
  MFC r264417: realpath(): Properly fail "." or ".." components after
  non-directories.
  
  If realpath() is called on pathnames like "/dev/null/." or "/dev/null/..",
  it should fail with [ENOTDIR]. Pathnames like "/dev/null/" already failed as
  they should.
  
  Also, put the check for non-directories after lstatting the previous
  component instead of when the empty component (consecutive or trailing
  slashes) is detected, saving an lstat() call and some lines of code.
  
  PR:		kern/82980

Modified:
  stable/9/lib/libc/stdlib/realpath.c
Directory Properties:
  stable/9/lib/libc/   (props changed)

Modified: stable/9/lib/libc/stdlib/realpath.c
==============================================================================
--- stable/9/lib/libc/stdlib/realpath.c	Tue Aug 12 19:56:26 2014	(r269889)
+++ stable/9/lib/libc/stdlib/realpath.c	Tue Aug 12 19:57:12 2014	(r269890)
@@ -132,26 +132,7 @@ realpath(const char * __restrict path, c
 			resolved[resolved_len] = '\0';
 		}
 		if (next_token[0] == '\0') {
-			/*
-			 * Handle consequential slashes.  The path
-			 * before slash shall point to a directory.
-			 *
-			 * Only the trailing slashes are not covered
-			 * by other checks in the loop, but we verify
-			 * the prefix for any (rare) "//" or "/\0"
-			 * occurence to not implement lookahead.
-			 */
-			if (lstat(resolved, &sb) != 0) {
-				if (m)
-					free(resolved);
-				return (NULL);
-			}
-			if (!S_ISDIR(sb.st_mode)) {
-				if (m)
-					free(resolved);
-				errno = ENOTDIR;
-				return (NULL);
-			}
+			/* Handle consequential slashes. */
 			continue;
 		}
 		else if (strcmp(next_token, ".") == 0)
@@ -236,6 +217,11 @@ realpath(const char * __restrict path, c
 				}
 			}
 			left_len = strlcpy(left, symlink, sizeof(left));
+		} else if (!S_ISDIR(sb.st_mode) && p != NULL) {
+			if (m)
+				free(resolved);
+			errno = ENOTDIR;
+			return (NULL);
 		}
 	}
 


More information about the svn-src-stable-9 mailing list