[git commit] readlink, realpath: fix a case with a symplink, closes 11021

Denys Vlasenko vda.linux at googlemail.com
Thu Jun 13 15:09:05 UTC 2019


commit: https://git.busybox.net/busybox/commit/?id=070aa6174728d35077d98e875717358ccfbf2870
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
xmalloc_realpath_coreutils                           125     201     +76

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 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;
+			}
 		}
 	}
 


More information about the busybox-cvs mailing list