about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--stdlib/canonicalize.c9
-rw-r--r--stdlib/test-canon.c4
2 files changed, 8 insertions, 5 deletions
diff --git a/stdlib/canonicalize.c b/stdlib/canonicalize.c
index 6237a41d42..e6566bd7d9 100644
--- a/stdlib/canonicalize.c
+++ b/stdlib/canonicalize.c
@@ -400,11 +400,14 @@ realpath_stk (const char *name, char *resolved,
 
 error:
   *dest++ = '\0';
-  if (!failed && resolved != NULL)
+  if (resolved != NULL)
     {
-      if (dest - rname <= get_path_max ())
+      /* Copy the full result on success or partial result if failure was due
+	 to the path not existing or not being accessible.  */
+      if ((!failed || errno == ENOENT || errno == EACCES)
+	  && dest - rname <= get_path_max ())
 	rname = strcpy (resolved, rname);
-      else
+      else if (!failed)
 	{
 	  failed = true;
 	  __set_errno (ENAMETOOLONG);
diff --git a/stdlib/test-canon.c b/stdlib/test-canon.c
index 2ad1218749..a9c83be17c 100644
--- a/stdlib/test-canon.c
+++ b/stdlib/test-canon.c
@@ -174,8 +174,8 @@ do_test (int argc, char ** argv)
 	  continue;
 	}
 
-      /* Only on success verify that buf contains the result too.  */
-      if (result != NULL
+      /* Verify buf contents if the call succeeded or failed with ENOENT.  */
+      if ((result != NULL || errno == ENOENT)
 	  && !check_path (buf, tests[i].out ? tests[i].out : tests[i].resolved))
 	{
 	  printf ("%s: flunked test %d (expected resolved `%s', got `%s')\n",