This is an automated email from the git hooks/post-receive script. guillem pushed a commit to branch master in repository dpkg.
commit 8ffbe5f5c0012c740e1b61c460cea093ac080dea Author: Guillem Jover <guil...@debian.org> Date: Sat Apr 22 18:48:10 2017 +0200 dpkg-maintscript-helper: Print all unowned files from a directory Add a new internal command that is not part of the public interface, that takes care of checking whether a pathname is owned by a package. This internal command has some logic to prevent external abuse, by checking whether the parent has set a specific environment variable with a token that changes per release. The code will list all unowned files because xargs does not short-circuit on the first command erroring out, as long these do not terminate with an exit code of 255. Closes: #813454, #860238 Based-on-patch-by: Bastien ROUCARIÈS <roucaries.bast...@gmail.com> --- debian/changelog | 4 ++++ scripts/dpkg-maintscript-helper.sh | 31 +++++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/debian/changelog b/debian/changelog index 92b2b27..d582817 100644 --- a/debian/changelog +++ b/debian/changelog @@ -6,6 +6,10 @@ dpkg (1.18.24) UNRELEASED; urgency=medium when scanning symbols/shlibs files. This was causing generation of bogus dependencies when multiple packages provide the same SONAME on different directories. Regression introduced in dpkg 1.18.17. Closes: #860979 + * Make dpkg-maintscript-helper print all unowned files from a directory + when printing the error message, to ease debugging those problems after + the fact. Closes: #813454, #860238 + Based on a patch by Bastien ROUCARIÈS <roucaries.bast...@gmail.com>. * Architecture support: - Add support for ARM64 ILP32. Closes: #824742 Thanks to Wookey <woo...@wookware.org>. diff --git a/scripts/dpkg-maintscript-helper.sh b/scripts/dpkg-maintscript-helper.sh index 1a0459f..378d03c 100755 --- a/scripts/dpkg-maintscript-helper.sh +++ b/scripts/dpkg-maintscript-helper.sh @@ -414,16 +414,12 @@ prepare_dir_to_symlink() # If there are locally created files or files owned by another package # we should not perform the switch. - find "$PATHNAME" -print0 | xargs -0 -n1 sh -c ' - package="$1" - file="$2" - if ! dpkg-query -L "$package" | grep -F -q -x "$file"; then - exit 1 - fi - exit 0 - ' check-files-ownership "$PACKAGE" || \ + export DPKG_MAINTSCRIPT_HELPER_INTERNAL_API="$version" + find "$PATHNAME" -print0 | \ + xargs -0 -n1 $0 _internal_pkg_must_own_file "$PACKAGE" || \ error "directory '$PATHNAME' contains files not owned by" \ "package $PACKAGE, cannot switch to symlink" + unset DPKG_MAINTSCRIPT_HELPER_INTERNAL_API # At this point, we know that the directory either contains no files, # or only non-conffiles owned by the package. @@ -517,6 +513,21 @@ ensure_package_owns_file() { return 0 } +internal_pkg_must_own_file() +{ + local PACKAGE="$1" + local FILE="$2" + + if [ "$DPKG_MAINTSCRIPT_HELPER_INTERNAL_API" != "$version" ]; then + error "internal API used by external command" + fi + + if ! ensure_package_owns_file "$PACKAGE" "$FILE"; then + error "file '$FILE' not owned by package '$PACKAGE'" + fi + return 0 +} + symlink_match() { local SYMLINK="$1" @@ -612,6 +623,10 @@ symlink_to_dir) dir_to_symlink) dir_to_symlink "$@" ;; +_internal_pkg_must_own_file) + # This is an internal command, must not be used outside this program. + internal_pkg_must_own_file "$@" + ;; --help|help|-?) usage ;; -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/dpkg/dpkg.git