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 <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2019-06-13 17:08:29 +02:00
parent 84d38500a7
commit 070aa61747

View File

@ -147,6 +147,35 @@ char* FAST_FUNC xmalloc_realpath_coreutils(const char *path)
buf[len++] = '/'; buf[len++] = '/';
strcpy(buf + len, last_slash); 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;
}
} }
} }