[pacman-dev] [PATCH] Detect potental confict when symlink to directory is changing to directory
When a symlink to a directory is changing to a directory and takes a file with
it, pacman does not result the path of the file on the filesystem when checking
for conflicts.
Reported by Neofytos and Luca from Chakra.
Signed-off-by: Allan McRae
s/potental/potential/ s/confict/conflict/ On 12/04/15 at 07:41am, Allan McRae wrote:
When a symlink to a directory is changing to a directory and takes a file with it, pacman does not result the path of the file on the filesystem when checking
The paths in question actually just need to be skipped altogether, not resolved.
for conflicts.
Reported by Neofytos and Luca from Chakra.
Signed-off-by: Allan McRae
--- This only works based on pacmans return failure. Why is the usr/include/bar being detected as a directory and not a symlink?
test/pacman/tests/TESTS | 1 + test/pacman/tests/symlink021.py | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 test/pacman/tests/symlink021.py
diff --git a/test/pacman/tests/TESTS b/test/pacman/tests/TESTS index e330896..bee7c8e 100644 --- a/test/pacman/tests/TESTS +++ b/test/pacman/tests/TESTS @@ -150,6 +150,7 @@ TESTS += test/pacman/tests/symlink010.py TESTS += test/pacman/tests/symlink011.py TESTS += test/pacman/tests/symlink012.py TESTS += test/pacman/tests/symlink020.py +TESTS += test/pacman/tests/symlink021.py TESTS += test/pacman/tests/sync-install-assumeinstalled.py TESTS += test/pacman/tests/sync-nodepversion01.py TESTS += test/pacman/tests/sync-nodepversion02.py diff --git a/test/pacman/tests/symlink021.py b/test/pacman/tests/symlink021.py
Our more recent tests use more descriptive names.
new file mode 100644 index 0000000..800094d --- /dev/null +++ b/test/pacman/tests/symlink021.py @@ -0,0 +1,27 @@ +self.description = "symlink -> dir replacment with file move" + +lp1 = pmpkg("pkg1") +lp1.files = ["usr/include/foo/", + "usr/include/bar -> foo", + "usr/include/foo/header.h"] +self.addpkg2db("local", lp1) + +sp1 = pmpkg("pkg1", "1.0-2") +sp1.files = ["usr/include/foo/"] +self.addpkg2db("sync", sp1) + +sp2 = pmpkg("pkg2", "1.0-2") +sp2.files = ["usr/include/bar/", + "usr/include/bar/header.h"] +self.addpkg2db("sync", sp2) + + +self.args = "-S %s %s" % (sp1.name, sp2.name) + +self.addrule("PACMAN_RETCODE=0") +self.addrule("FILE_TYPE=usr/include/foo|dir") +self.addrule("FILE_TYPE=usr/include/bar|dir") +self.addrule("FILE_EXIST=usr/include/foo/header.h")
usr/include/foo/header.h is not in the updated package's file list.
+self.addrule("FILE_EXIST=usr/include/bar/header.h") + +self.expectfailure = True -- 2.6.3
On 05/12/15 05:13, Andrew Gregory wrote:
s/potental/potential/ s/confict/conflict/
On 12/04/15 at 07:41am, Allan McRae wrote:
When a symlink to a directory is changing to a directory and takes a file with it, pacman does not result the path of the file on the filesystem when checking
The paths in question actually just need to be skipped altogether, not resolved.
for conflicts.
Reported by Neofytos and Luca from Chakra.
Signed-off-by: Allan McRae
--- This only works based on pacmans return failure. Why is the usr/include/bar being detected as a directory and not a symlink?
test/pacman/tests/TESTS | 1 + test/pacman/tests/symlink021.py | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 test/pacman/tests/symlink021.py
diff --git a/test/pacman/tests/TESTS b/test/pacman/tests/TESTS index e330896..bee7c8e 100644 --- a/test/pacman/tests/TESTS +++ b/test/pacman/tests/TESTS @@ -150,6 +150,7 @@ TESTS += test/pacman/tests/symlink010.py TESTS += test/pacman/tests/symlink011.py TESTS += test/pacman/tests/symlink012.py TESTS += test/pacman/tests/symlink020.py +TESTS += test/pacman/tests/symlink021.py TESTS += test/pacman/tests/sync-install-assumeinstalled.py TESTS += test/pacman/tests/sync-nodepversion01.py TESTS += test/pacman/tests/sync-nodepversion02.py diff --git a/test/pacman/tests/symlink021.py b/test/pacman/tests/symlink021.py
Our more recent tests use more descriptive names.
Thanks for the fixes. This one is a partner to symlink020.py so I kept the name. A
libarchive will not extract a directory over an existing directory
symlink, making it impossible to replace a symlink with a directory
across packages. Adding the ARCHIVE_EXTRACT_UNLINK and
ARCHIVE_EXTRACT_SECURE_SYMLINKS causes libarchive to unlink the existing
symlink and prevents it from extracting any paths that contain
a symlink, which we should not be doing anyway.
Signed-off-by: Andrew Gregory
When replacing a file with a directory, any files inside the new
directory cannot possibly exist on the filesystem and can be skipped.
This allows cross-package symlink-to-directory transitions when there
are files with the same name under both the symlinked directory and the
new directory.
Signed-off-by: Andrew Gregory
participants (2)
-
Allan McRae
-
Andrew Gregory