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:
parent
84d38500a7
commit
070aa61747
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user