diff options
author | Siddhesh Poyarekar <siddhesh@sourceware.org> | 2022-02-21 08:26:06 +0530 |
---|---|---|
committer | Siddhesh Poyarekar <siddhesh@sourceware.org> | 2022-02-21 08:26:33 +0530 |
commit | 949ad78a189194048df8a253bb31d1d11d919044 (patch) | |
tree | c4d2f8a544581a91225839aa8cfd67ddced94028 /stdlib | |
parent | b98d0bbf747f39770e0caba7e984ce9f8f900330 (diff) | |
download | glibc-949ad78a189194048df8a253bb31d1d11d919044.zip glibc-949ad78a189194048df8a253bb31d1d11d919044.tar.gz glibc-949ad78a189194048df8a253bb31d1d11d919044.tar.bz2 |
realpath: Do not copy result on failure (BZ #28815)
On failure, the contents of the resolved buffer passed in by the caller
to realpath are undefined. Do not copy any partial resolution to the
buffer and also do not test resolved contents in test-canon.c.
Resolves: BZ #28815
Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'stdlib')
-rw-r--r-- | stdlib/canonicalize.c | 4 | ||||
-rw-r--r-- | stdlib/test-canon.c | 4 |
2 files changed, 5 insertions, 3 deletions
diff --git a/stdlib/canonicalize.c b/stdlib/canonicalize.c index 6caed9e..6237a41 100644 --- a/stdlib/canonicalize.c +++ b/stdlib/canonicalize.c @@ -400,11 +400,11 @@ realpath_stk (const char *name, char *resolved, error: *dest++ = '\0'; - if (resolved != NULL) + if (!failed && resolved != NULL) { if (dest - rname <= get_path_max ()) rname = strcpy (resolved, rname); - else if (!failed) + else { failed = true; __set_errno (ENAMETOOLONG); diff --git a/stdlib/test-canon.c b/stdlib/test-canon.c index 185ccf4..2ad1218 100644 --- a/stdlib/test-canon.c +++ b/stdlib/test-canon.c @@ -174,7 +174,9 @@ do_test (int argc, char ** argv) continue; } - if (!check_path (buf, tests[i].out ? tests[i].out : tests[i].resolved)) + /* Only on success verify that buf contains the result too. */ + if (result != NULL + && !check_path (buf, tests[i].out ? tests[i].out : tests[i].resolved)) { printf ("%s: flunked test %d (expected resolved `%s', got `%s')\n", argv[0], i, tests[i].out ? tests[i].out : tests[i].resolved, |