aboutsummaryrefslogtreecommitdiff
path: root/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib')
-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",