diff options
author | Jeremie Koenig <jk@jk.fr.eu.org> | 2010-05-27 15:32:19 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-07-19 00:43:05 +0200 |
commit | b175462422f02a159a14dc5561d8bef6f84b2b66 (patch) | |
tree | 3cac1b222d0222bbf52edaff95a9c3bf388b3bd8 | |
parent | daf286cda559dd1eff0c9db46a4562c0255e76f1 (diff) | |
download | busybox-w32-b175462422f02a159a14dc5561d8bef6f84b2b66.tar.gz busybox-w32-b175462422f02a159a14dc5561d8bef6f84b2b66.tar.bz2 busybox-w32-b175462422f02a159a14dc5561d8bef6f84b2b66.zip |
readlink: use xmalloc_realpath()
Using realpath() directly with a non-NULL output buffer is unsafe because its
behavior is unspecified on systems which don't have PATH_MAX (ie. Hurd)
I beleive this also fixes a small bug whereby 'buf' would not be freed
on 'readlink -v' with ENABLE_FEATURE_CLEANUP.
Signed-off-by: Jeremie Koenig <jk@jk.fr.eu.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | coreutils/readlink.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/coreutils/readlink.c b/coreutils/readlink.c index 20df38b96..2ed5e2cac 100644 --- a/coreutils/readlink.c +++ b/coreutils/readlink.c | |||
@@ -36,7 +36,6 @@ int readlink_main(int argc UNUSED_PARAM, char **argv) | |||
36 | { | 36 | { |
37 | char *buf; | 37 | char *buf; |
38 | char *fname; | 38 | char *fname; |
39 | char pathbuf[PATH_MAX]; | ||
40 | 39 | ||
41 | IF_FEATURE_READLINK_FOLLOW( | 40 | IF_FEATURE_READLINK_FOLLOW( |
42 | unsigned opt; | 41 | unsigned opt; |
@@ -56,7 +55,7 @@ int readlink_main(int argc UNUSED_PARAM, char **argv) | |||
56 | logmode = LOGMODE_NONE; | 55 | logmode = LOGMODE_NONE; |
57 | 56 | ||
58 | if (opt & 1) { /* -f */ | 57 | if (opt & 1) { /* -f */ |
59 | buf = realpath(fname, pathbuf); | 58 | buf = xmalloc_realpath(fname); |
60 | } else { | 59 | } else { |
61 | buf = xmalloc_readlink_or_warn(fname); | 60 | buf = xmalloc_readlink_or_warn(fname); |
62 | } | 61 | } |
@@ -65,7 +64,7 @@ int readlink_main(int argc UNUSED_PARAM, char **argv) | |||
65 | return EXIT_FAILURE; | 64 | return EXIT_FAILURE; |
66 | printf((opt & 2) ? "%s" : "%s\n", buf); | 65 | printf((opt & 2) ? "%s" : "%s\n", buf); |
67 | 66 | ||
68 | if (ENABLE_FEATURE_CLEAN_UP && !opt) | 67 | if (ENABLE_FEATURE_CLEAN_UP) |
69 | free(buf); | 68 | free(buf); |
70 | 69 | ||
71 | fflush_stdout_and_exit(EXIT_SUCCESS); | 70 | fflush_stdout_and_exit(EXIT_SUCCESS); |