svn commit: r236582 - head/lib/libc/stdlib

Andrey A. Chernov ache at FreeBSD.org
Mon Jun 4 21:34:50 UTC 2012


Author: ache
Date: Mon Jun  4 21:34:49 2012
New Revision: 236582
URL: http://svn.freebsd.org/changeset/base/236582

Log:
  1) IEEE Std 1003.1-2008, "errno" section, is explicit that
  
  "The setting of errno after a successful call to a function is
  unspecified unless the description of that function specifies that
  errno shall not be modified."
  
  However, free() in IEEE Std 1003.1-2008 does not mention its interaction
  with errno, so MAY modify it after successful call
  (it depends on particular free() implementation, OS-specific, etc.).
  
  So, save errno across free() calls to make code portable and
  POSIX-conformant.
  
  2) Remove unused serrno assignment.
  
  MFC after:      1 week

Modified:
  head/lib/libc/stdlib/realpath.c

Modified: head/lib/libc/stdlib/realpath.c
==============================================================================
--- head/lib/libc/stdlib/realpath.c	Mon Jun  4 20:56:40 2012	(r236581)
+++ head/lib/libc/stdlib/realpath.c	Mon Jun  4 21:34:49 2012	(r236582)
@@ -65,7 +65,6 @@ realpath(const char * __restrict path, c
 		errno = ENOENT;
 		return (NULL);
 	}
-	serrno = errno;
 	if (resolved == NULL) {
 		resolved = malloc(PATH_MAX);
 		if (resolved == NULL)
@@ -83,9 +82,11 @@ realpath(const char * __restrict path, c
 		left_len = strlcpy(left, path + 1, sizeof(left));
 	} else {
 		if (getcwd(resolved, PATH_MAX) == NULL) {
-			if (m)
+			if (m) {
+				serrno = errno;
 				free(resolved);
-			else {
+				errno = serrno;
+			} else {
 				resolved[0] = '.';
 				resolved[1] = '\0';
 			}
@@ -143,8 +144,11 @@ realpath(const char * __restrict path, c
 			 * occurence to not implement lookahead.
 			 */
 			if (lstat(resolved, &sb) != 0) {
-				if (m)
+				if (m) {
+					serrno = errno;
 					free(resolved);
+					errno = serrno;
+				}
 				return (NULL);
 			}
 			if (!S_ISDIR(sb.st_mode)) {
@@ -184,8 +188,11 @@ realpath(const char * __restrict path, c
 		if (lstat(resolved, &sb) != 0) {
 			if (errno != ENOENT || p != NULL)
 				errno = ENOTDIR;
-			if (m)
+			if (m) {
+				serrno = errno;
 				free(resolved);
+				errno = serrno;
+			}
 			return (NULL);
 		}
 		if (S_ISLNK(sb.st_mode)) {
@@ -197,8 +204,11 @@ realpath(const char * __restrict path, c
 			}
 			slen = readlink(resolved, symlink, sizeof(symlink) - 1);
 			if (slen < 0) {
-				if (m)
+				if (m) {
+					serrno = errno;
 					free(resolved);
+					errno = serrno;
+				}
 				return (NULL);
 			}
 			symlink[slen] = '\0';


More information about the svn-src-all mailing list