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> --- 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