From de7a5cf346c3ea8c26e43f4f17834af6fc38a13b Mon Sep 17 00:00:00 2001 From: Andrew Gregory Date: Sat, 11 Aug 2012 17:35:12 -0400 Subject: query_fileowner: remove assumption that root is "/" Returning "/" from mdirname removes it as a special case which allows us to test it like any other directory. This corrects a false positive when querying a file in / and root is not set to /. Signed-off-by: Andrew Gregory --- src/pacman/query.c | 31 ++++++------------------------- src/pacman/util.c | 5 +++++ 2 files changed, 11 insertions(+), 25 deletions(-) diff --git a/src/pacman/query.c b/src/pacman/query.c index 50b52dd7..ed8bc1b5 100644 --- a/src/pacman/query.c +++ b/src/pacman/query.c @@ -173,21 +173,12 @@ static int query_fileowner(alpm_list_t *targets) bname = mbasename(filename); dname = mdirname(filename); - /* for files in '/', there is no directory name to match */ - if(strcmp(dname, "") == 0) { - rpath = NULL; - } else { - rpath = realpath(dname, NULL); + rpath = realpath(dname, NULL); - if(!rpath) { - pm_printf(ALPM_LOG_ERROR, _("cannot determine real path for '%s': %s\n"), - filename, strerror(errno)); - free(filename); - free(dname); - free(rpath); - ret++; - continue; - } + if(!dname || !rpath) { + pm_printf(ALPM_LOG_ERROR, _("cannot determine real path for '%s': %s\n"), + filename, strerror(errno)); + goto targcleanup; } free(dname); @@ -206,21 +197,11 @@ static int query_fileowner(alpm_list_t *targets) continue; } - /* for files in '/', there is no directory name to match */ - if(!rpath) { - if(strcmp(pkgfile, bname) == 0) { - print_query_fileowner(filename, info); - found = 1; - break; - } - continue; - } - + /* concatenate our file and the root path */ if(rootlen + 1 + strlen(pkgfile) > PATH_MAX) { pm_printf(ALPM_LOG_ERROR, _("path too long: %s%s\n"), path, pkgfile); continue; } - /* concatenate our file and the root path */ strcpy(path + rootlen, pkgfile); pdname = mdirname(path); diff --git a/src/pacman/util.c b/src/pacman/util.c index 7f7f6a74..2d1b7626 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -244,9 +244,14 @@ char *mdirname(const char *path) if(last != NULL) { /* we found a '/', so terminate our string */ + if(last == ret) { + /* return "/" for root */ + last++; + } *last = '\0'; return ret; } + /* no slash found */ free(ret); return strdup("."); -- cgit v1.2.3-24-g4f1b