aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@linux.intel.com>2014-04-15 09:27:38 -0700
committerH. Peter Anvin <hpa@linux.intel.com>2014-04-15 09:27:38 -0700
commit4a66f39cb53fde78c4518615382be83a9e2bff0b (patch)
treef68542d62d5fc87e9ddb6af6983f251ef0213ed5
parenta51893a6d52a8cdf247cb1bd10dd8987d4d7eb49 (diff)
downloadklibc-4a66f39cb53fde78c4518615382be83a9e2bff0b.tar.gz
readlink: Better buffer handling
- Allow PATH_MAX bytes, not just a hard-coded 128 bytes - Just allocate the buffer on the stack, no need for malloc() - Use puts() rather than printf() Reported-by: Rafi Rubin <rafi@seas.upenn.edu> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r--usr/utils/readlink.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/usr/utils/readlink.c b/usr/utils/readlink.c
index 5ea4e41cd40a9..8b620fdb63770 100644
--- a/usr/utils/readlink.c
+++ b/usr/utils/readlink.c
@@ -13,8 +13,9 @@ static __noreturn usage(void)
int main(int argc, char *argv[])
{
- char *name, *link_name = NULL;
- size_t max_siz = 128;
+ const char *name;
+ char link_name[PATH_MAX];
+ int rv;
progname = *argv++;
@@ -22,15 +23,12 @@ int main(int argc, char *argv[])
if (!name)
usage();
- link_name = malloc(max_siz);
- if (!link_name) {
- perror("malloc");
+ rv = readlink(name, link_name, sizeof link_name - 1);
+ if (rv < 0) {
+ perror(name);
exit(1);
}
-
- if (readlink(name, link_name, max_siz) == -1)
- exit(1);
- printf("%s\n", link_name);
-
+ link_name[rv] = '\0';
+ puts(link_name);
exit(0);
}