aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremie Koenig <jk@jk.fr.eu.org>2010-05-27 15:32:19 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2010-07-19 00:43:05 +0200
commitb175462422f02a159a14dc5561d8bef6f84b2b66 (patch)
tree3cac1b222d0222bbf52edaff95a9c3bf388b3bd8
parentdaf286cda559dd1eff0c9db46a4562c0255e76f1 (diff)
downloadbusybox-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.c5
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);