Hello.

I'm not sure but it seems to me that there are several missed things:
- checking path against NULL,
- setting errno to ENOMEM in case of malloc() failure,
- clarification in comments.


-- 
Alexei Malinin


--- src/lib/libc/stdlib/realpath.c.orig Tue Oct 13 23:55:37 2015
+++ src/lib/libc/stdlib/realpath.c      Mon Mar 21 15:16:52 2016
@@ -41,8 +41,9 @@
  * char *realpath(const char *path, char resolved[PATH_MAX]);
  *
  * Find the real name of path, by removing all ".", ".." and symlink
- * components.  Returns (resolved) on success, or (NULL) on failure,
- * in which case the path which caused trouble is left in (resolved).
+ * components.  Returns (resolved) on success; sets (errno) and returns
+ * (NULL) on failure, in which case the path which caused trouble
+ * is left in (resolved).
  */
 char *
 realpath(const char *path, char *resolved)
@@ -54,6 +55,11 @@
        int serrno, slen, mem_allocated;
        char left[PATH_MAX], next_token[PATH_MAX], symlink[PATH_MAX];

+       if (path == NULL) {
+               errno = ENOENT;
+               return (NULL);
+       }
+
        if (path[0] == '\0') {
                errno = ENOENT;
                return (NULL);
@@ -63,8 +69,10 @@

        if (resolved == NULL) {
                resolved = malloc(PATH_MAX);
-               if (resolved == NULL)
+               if (resolved == NULL) {
+                       errno = ENOMEM;
                        return (NULL);
+               }
                mem_allocated = 1;
        } else
                mem_allocated = 0;


Reply via email to