From de7a5cf346c3ea8c26e43f4f17834af6fc38a13b Mon Sep 17 00:00:00 2001
From: Andrew Gregory <andrew.gregory.8@gmail.com>
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 <andrew.gregory.8@gmail.com>
---
 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-70-g09d2