From 070aa6174728d35077d98e875717358ccfbf2870 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 13 Jun 2019 17:08:29 +0200 Subject: [PATCH] readlink,realpath: fix a case with a symplink, closes 11021 function old new delta xmalloc_realpath_coreutils 125 201 +76 Signed-off-by: Denys Vlasenko --- libbb/xreadlink.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/libbb/xreadlink.c b/libbb/xreadlink.c index ead30e499..a4e402b84 100644 --- a/libbb/xreadlink.c +++ b/libbb/xreadlink.c @@ -147,6 +147,35 @@ char* FAST_FUNC xmalloc_realpath_coreutils(const char *path) buf[len++] = '/'; strcpy(buf + len, last_slash); } + } else { + char *link = xmalloc_readlink(path); + if (link) { + char *cwd; + if (link[0] == '/') { + /* + * $ ln -s /bin/qwe symlink # note: /bin is a link to /usr/bin + * $ readlink -f symlink + * /usr/bin/qwe/target_does_not_exist + * $ realpath symlink + * /usr/bin/qwe/target_does_not_exist + */ + buf = xmalloc_realpath_coreutils(link); + free(link); + return buf; + } + /* + * $ ln -s target_does_not_exist symlink + * $ readlink -f symlink + * /CURDIR/target_does_not_exist + * $ realpath symlink + * /CURDIR/target_does_not_exist + */ + cwd = xrealloc_getcwd_or_warn(NULL); + buf = concat_path_file(cwd, link); + free(cwd); + free(link); + return buf; + } } } -- 2.25.1