diff options
author | Karel Zak <kzak@redhat.com> | 2012-04-20 15:06:57 +0200 |
---|---|---|
committer | Karel Zak <kzak@redhat.com> | 2012-04-20 15:06:57 +0200 |
commit | 89394013f620338863312d069a9b2ac5ba2abf65 (patch) | |
tree | 884bc6cf74cb3e5cef175965c57b0a07b3285096 /misc-utils | |
parent | 3e90c89f95eeb103b0d3e64761fef638e0293291 (diff) | |
download | util-linux-89394013f620338863312d069a9b2ac5ba2abf65.tar.gz |
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')
-rw-r--r-- | misc-utils/namei.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/misc-utils/namei.c b/misc-utils/namei.c index 9b8ede90..b15d4f7b 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'; } |