[pacman-dev] [PATCH 2/2 v2] It turns out we do care about directories...

Allan McRae allan at archlinux.org
Tue Dec 11 09:38:13 EST 2012


This is a bug that has been around since at least 2007.  On a package
upgrade (either by -S or -U) a new directory could overwrite any file.
This is caused by the filelist difference calculation ignoring all
directories and thus no new directories were checked for conflicting
files on the filesystem.

Signed-off-by: Allan McRae <allan at archlinux.org>
---

This version also cares about directories at the end of filelists...

 lib/libalpm/filelist.c               | 28 +++++++++-------------------
 test/pacman/tests/fileconflict020.py |  2 --
 test/pacman/tests/fileconflict021.py |  2 --
 3 files changed, 9 insertions(+), 23 deletions(-)

diff --git a/lib/libalpm/filelist.c b/lib/libalpm/filelist.c
index bf7645b..f884e6a 100644
--- a/lib/libalpm/filelist.c
+++ b/lib/libalpm/filelist.c
@@ -228,34 +228,24 @@ alpm_list_t *_alpm_filelist_difference(alpm_filelist_t *filesA,
 		alpm_file_t *fileA = filesA->files + ctrA;
 		const char *strA = filesA->resolved_path[ctrA];
 		const char *strB = filesB->resolved_path[ctrB];
-		/* skip directories, we don't care about them */
-		if(strA[strlen(strA)-1] == '/') {
+
+		int cmp = strcmp(strA, strB);
+		if(cmp < 0) {
+			/* item only in filesA, qualifies as a difference */
+			ret = alpm_list_add(ret, fileA);
 			ctrA++;
-		} else if(strB[strlen(strB)-1] == '/') {
+		} else if(cmp > 0) {
 			ctrB++;
 		} else {
-			int cmp = strcmp(strA, strB);
-			if(cmp < 0) {
-				/* item only in filesA, qualifies as a difference */
-				ret = alpm_list_add(ret, fileA);
-				ctrA++;
-			} else if(cmp > 0) {
-				ctrB++;
-			} else {
-				ctrA++;
-				ctrB++;
-			}
+			ctrA++;
+			ctrB++;
 		}
 	}
 
 	/* ensure we have completely emptied pA */
 	while(ctrA < filesA->count) {
 		alpm_file_t *fileA = filesA->files + ctrA;
-		const char *strA = fileA->name;
-		/* skip directories */
-		if(strA[strlen(strA)-1] != '/') {
-			ret = alpm_list_add(ret, fileA);
-		}
+		ret = alpm_list_add(ret, fileA);
 		ctrA++;
 	}
 
diff --git a/test/pacman/tests/fileconflict020.py b/test/pacman/tests/fileconflict020.py
index 306aca2..db59e47 100644
--- a/test/pacman/tests/fileconflict020.py
+++ b/test/pacman/tests/fileconflict020.py
@@ -16,5 +16,3 @@
 self.addrule("PACMAN_RETCODE=1")
 self.addrule("PKG_VERSION=pkg2|1.0-1")
 self.addrule("!DIR_EXIST=usr/bin/foo/")
-
-self.expectfailure = True
diff --git a/test/pacman/tests/fileconflict021.py b/test/pacman/tests/fileconflict021.py
index ccb70f2..f695aef 100644
--- a/test/pacman/tests/fileconflict021.py
+++ b/test/pacman/tests/fileconflict021.py
@@ -14,5 +14,3 @@
 self.addrule("PACMAN_RETCODE=1")
 self.addrule("PKG_VERSION=pkg1|1.0-1")
 self.addrule("!DIR_EXIST=file/")
-
-self.expectfailure = True
-- 
1.8.0.1



More information about the pacman-dev mailing list