diff options
author | Andrew Gregory <andrew.gregory.8@gmail.com> | 2012-07-26 07:04:20 +0200 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2012-09-18 15:27:23 +0200 |
commit | 03f2e2360ab2950675f9cde32ccc93d1753c6541 (patch) | |
tree | 88b250c6c0ace7435abb22decf90c77f612d11de | |
parent | 140c76d3288b41773411534638305dc8b5928951 (diff) | |
download | pacman-03f2e2360ab2950675f9cde32ccc93d1753c6541.tar.gz pacman-03f2e2360ab2950675f9cde32ccc93d1753c6541.tar.xz |
query_fileowner: remove trailing '/' from targets
Trailing '/' in paths causes lstat to dereference symlinks to
directories which causes it to break even though the symlink is a valid
target.
Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com>
-rw-r--r-- | src/pacman/query.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/pacman/query.c b/src/pacman/query.c index 176f91c2..50b52dd7 100644 --- a/src/pacman/query.c +++ b/src/pacman/query.c @@ -58,7 +58,7 @@ static int search_path(char **filename, struct stat *bufptr) /* strip the trailing slash if one exists */ while(path[plen - 1] == '/') { - path[--plen] = '\0'; + path[--plen] = '\0'; } fullname = malloc(plen + flen + 2); @@ -133,10 +133,17 @@ static int query_fileowner(alpm_list_t *targets) const char *bname; struct stat buf; alpm_list_t *i; + size_t len; int found = 0; filename = strdup(t->data); + /* trailing '/' causes lstat to dereference directory symlinks */ + len = strlen(filename) - 1; + while(len > 0 && filename[len] == '/') { + filename[len--] = '\0'; + } + if(lstat(filename, &buf) == -1) { /* if it is not a path but a program name, then check in PATH */ if(strchr(filename, '/') == NULL) { |