summaryrefslogtreecommitdiffstats
path: root/misc-utils/namei.c
diff options
context:
space:
mode:
authorKarel Zak2012-04-20 15:06:57 +0200
committerKarel Zak2012-04-20 15:06:57 +0200
commit89394013f620338863312d069a9b2ac5ba2abf65 (patch)
tree884bc6cf74cb3e5cef175965c57b0a07b3285096 /misc-utils/namei.c
parentdocs: move fstab.5 to sys-utils (mount/ dir is deprecated) (diff)
downloadkernel-qcow2-util-linux-89394013f620338863312d069a9b2ac5ba2abf65.tar.gz
kernel-qcow2-util-linux-89394013f620338863312d069a9b2ac5ba2abf65.tar.xz
kernel-qcow2-util-linux-89394013f620338863312d069a9b2ac5ba2abf65.zip
namei: fix relative symlinks evaluation
Fedora 17 (/bin is symlink to /usr/bin): [root@intel ~]# /bin/namei /bin/namei f: /bin/namei d / l bin -> usr/bin usr - No such file or directory Reported-by: Jan Stancek <jstancek@redhat.com> Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'misc-utils/namei.c')
-rw-r--r--misc-utils/namei.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/misc-utils/namei.c b/misc-utils/namei.c
index 9b8ede901..b15d4f7b6 100644
--- a/misc-utils/namei.c
+++ b/misc-utils/namei.c
@@ -180,6 +180,7 @@ readlink_to_namei(struct namei *nm, const char *path)
{
char sym[PATH_MAX];
ssize_t sz;
+ int isrel = 0;
sz = readlink(path, sym, sizeof(sym));
if (sz < 1)
@@ -187,20 +188,26 @@ readlink_to_namei(struct namei *nm, const char *path)
if (*sym != '/') {
char *p = strrchr(path, '/');
- nm->relstart = p ? p - path : 0;
- if (nm->relstart)
+ if (p) {
+ isrel = 1;
+ nm->relstart = p ? p - path : 0;
sz += nm->relstart + 1;
+ }
}
nm->abslink = xmalloc(sz + 1);
- if (*sym != '/' && nm->relstart) {
+ if (*sym != '/' && isrel) {
/* create the absolute path from the relative symlink */
memcpy(nm->abslink, path, nm->relstart);
*(nm->abslink + nm->relstart) = '/';
nm->relstart++;
memcpy(nm->abslink + nm->relstart, sym, sz - nm->relstart);
} else
+ /* - absolute link (foo -> /path/bar)
+ * - or link without any subdir (foo -> bar)
+ */
memcpy(nm->abslink, sym, sz);
+
nm->abslink[sz] = '\0';
}