Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Aug 2014 19:57:12 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r269890 - stable/9/lib/libc/stdlib
Message-ID:  <53ea7198.6760.21dd1ae1@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 		}
 	}
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?53ea7198.6760.21dd1ae1>