diff options
author | Allan McRae <allan@archlinux.org> | 2012-12-06 13:35:22 +0100 |
---|---|---|
committer | Allan McRae <allan@archlinux.org> | 2012-12-14 03:35:34 +0100 |
commit | 0c2edbdd4992f3107d7a2bd600829fcb3f344d48 (patch) | |
tree | f58f6bf0007535b9f992fa341affa4705e063758 | |
parent | 4a427dbc1bca50c516c41e4ae2cb0122c686f88d (diff) | |
download | pacman-0c2edbdd4992f3107d7a2bd600829fcb3f344d48.tar.gz pacman-0c2edbdd4992f3107d7a2bd600829fcb3f344d48.tar.xz |
It turns out we do care about directories...
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@archlinux.org>
-rw-r--r-- | lib/libalpm/filelist.c | 28 | ||||
-rw-r--r-- | test/pacman/tests/fileconflict020.py | 2 | ||||
-rw-r--r-- | 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 bf7645b8..f884e6a8 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 306aca23..db59e47b 100644 --- a/test/pacman/tests/fileconflict020.py +++ b/test/pacman/tests/fileconflict020.py @@ -16,5 +16,3 @@ self.args = "-S pkg2" 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 ccb70f25..f695aefa 100644 --- a/test/pacman/tests/fileconflict021.py +++ b/test/pacman/tests/fileconflict021.py @@ -14,5 +14,3 @@ self.args = "-S pkg1" self.addrule("PACMAN_RETCODE=1") self.addrule("PKG_VERSION=pkg1|1.0-1") self.addrule("!DIR_EXIST=file/") - -self.expectfailure = True |