Package: dpkg
Version: 1.18.9
Severity: wishlist

Hi,

while "playing" with the APT code calling dpkg and testing these changes
I noticed that conffiles in my DPKG_ROOT playground aren't handled by
dpkg-maintscript-helper at all. The problem is that the conffile
parameter is used for two things: a) as the absolute path to the
conffile which should be prefixed with DPKG_ROOT and b) as an identifier
disguised as a path to e.g. retrieve the md5sum of the file from the
dpkg/status file, which shouldn't be prefixed.

In the attached incomplete patch I decided to treat b) as the canonical
use and hence let the helper prefix each time it uses it as a path. That
makes conffile handling magically work without further changes in
callers, which is nice, but I can envision problems with package
maintainers confusing it as a) and "helpfully" support DPKG_ROOT in
their scripts, which would then break in exactly the usecase it was
supposed to help with while it will happily work as before in "normal"
usecases as DPKG_ROOT defaults to be empty…

The patch also doesn't handle symlink_to_dir and vice versa as seeing
string comparisons with 'readlink' calls in the code and envisioning
symlinks in the DPKG_ROOT path made me feel very dizzy very fast.


Note: This isn't blocking anything I do, I have no particular big
interest in it either and I doubt its going to become a huge issue any
time soon for anyone using DPKG_ROOT, so if there were a severity below
wishlist, that report would have it…


Best regards

David Kalnischkies
From bae1b41a7d450e9be895edee4220fe34bbe99946 Mon Sep 17 00:00:00 2001
From: David Kalnischkies <da...@kalnischkies.de>
Date: Sat, 23 Jul 2016 10:07:53 +0200
Subject: [PATCH] [INCOMPLETE] dpkg-maintscript-helper: support DPKG_ROOT
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

As dpkg-maintscript-helper "works around known dpkg limitations in
maintainer scripts" it should behave as if it were a maintainerscript
and prepend DPKG_ROOT to all paths it uses.

This is preferred over having the conffile parameter(s) be prepended
with DPKG_ROOT by the maintainerscripts calling the helper as the helper
would then need to strip DPKG_ROOT from the path to verify if the
conffile belongs to the package – it also means that it magically works
for all callers instantly instead of requiring e.g. dh_installdeb to be
patched and packages to be rebuilt against a patched version.

FIXME:
- The same should apply to symlink_to_dir and vice versa.
---
 scripts/dpkg-maintscript-helper.sh | 62 +++++++++++++++++++-------------------
 1 file changed, 31 insertions(+), 31 deletions(-)

diff --git a/scripts/dpkg-maintscript-helper.sh b/scripts/dpkg-maintscript-helper.sh
index f0e69db..94dc43a 100755
--- a/scripts/dpkg-maintscript-helper.sh
+++ b/scripts/dpkg-maintscript-helper.sh
@@ -66,8 +66,8 @@ rm_conffile() {
 		;;
 	postrm)
 		if [ "$1" = "purge" ]; then
-			rm -f "$CONFFILE.dpkg-bak" "$CONFFILE.dpkg-remove" \
-			      "$CONFFILE.dpkg-backup"
+			rm -f "${DPKG_ROOT}$CONFFILE.dpkg-bak" "${DPKG_ROOT}$CONFFILE.dpkg-remove" \
+			      "${DPKG_ROOT}$CONFFILE.dpkg-backup"
 		fi
 		if [ "$1" = "abort-install" -o "$1" = "abort-upgrade" ] &&
 		   [ -n "$2" ] &&
@@ -85,31 +85,31 @@ prepare_rm_conffile() {
 	local CONFFILE="$1"
 	local PACKAGE="$2"
 
-	[ -e "$CONFFILE" ] || return 0
+	[ -e "${DPKG_ROOT}$CONFFILE" ] || return 0
 	ensure_package_owns_file "$PACKAGE" "$CONFFILE" || return 0
 
 	local md5sum old_md5sum
-	md5sum="$(md5sum "$CONFFILE" | sed -e 's/ .*//')"
+	md5sum="$(md5sum "${DPKG_ROOT}$CONFFILE" | sed -e 's/ .*//')"
 	old_md5sum="$(dpkg-query -W -f='${Conffiles}' "$PACKAGE" | \
 		sed -n -e "\'^ $CONFFILE ' { s/ obsolete$//; s/.* //; p }")"
 	if [ "$md5sum" != "$old_md5sum" ]; then
-		mv -f "$CONFFILE" "$CONFFILE.dpkg-backup"
+		mv -f "${DPKG_ROOT}$CONFFILE" "${DPKG_ROOT}$CONFFILE.dpkg-backup"
 	else
-		mv -f "$CONFFILE" "$CONFFILE.dpkg-remove"
+		mv -f "${DPKG_ROOT}$CONFFILE" "${DPKG_ROOT}$CONFFILE.dpkg-remove"
 	fi
 }
 
 finish_rm_conffile() {
 	local CONFFILE="$1"
 
-	if [ -e "$CONFFILE.dpkg-backup" ]; then
-		echo "Obsolete conffile $CONFFILE has been modified by you."
-		echo "Saving as $CONFFILE.dpkg-bak ..."
-		mv -f "$CONFFILE.dpkg-backup" "$CONFFILE.dpkg-bak"
+	if [ -e "${DPKG_ROOT}$CONFFILE.dpkg-backup" ]; then
+		echo "Obsolete conffile ${DPKG_ROOT}$CONFFILE has been modified by you."
+		echo "Saving as ${DPKG_ROOT}$CONFFILE.dpkg-bak ..."
+		mv -f "${DPKG_ROOT}$CONFFILE.dpkg-backup" "${DPKG_ROOT}$CONFFILE.dpkg-bak"
 	fi
-	if [ -e "$CONFFILE.dpkg-remove" ]; then
-		echo "Removing obsolete conffile $CONFFILE ..."
-		rm -f "$CONFFILE.dpkg-remove"
+	if [ -e "${DPKG_ROOT}$CONFFILE.dpkg-remove" ]; then
+		echo "Removing obsolete conffile ${DPKG_ROOT}$CONFFILE ..."
+		rm -f "${DPKG_ROOT}$CONFFILE.dpkg-remove"
 	fi
 }
 
@@ -119,13 +119,13 @@ abort_rm_conffile() {
 
 	ensure_package_owns_file "$PACKAGE" "$CONFFILE" || return 0
 
-	if [ -e "$CONFFILE.dpkg-remove" ]; then
-		echo "Reinstalling $CONFFILE that was moved away"
-		mv "$CONFFILE.dpkg-remove" "$CONFFILE"
+	if [ -e "${DPKG_ROOT}$CONFFILE.dpkg-remove" ]; then
+		echo "Reinstalling ${DPKG_ROOT}$CONFFILE that was moved away"
+		mv "${DPKG_ROOT}$CONFFILE.dpkg-remove" "${DPKG_ROOT}$CONFFILE"
 	fi
-	if [ -e "$CONFFILE.dpkg-backup" ]; then
-		echo "Reinstalling $CONFFILE that was backupped"
-		mv "$CONFFILE.dpkg-backup" "$CONFFILE"
+	if [ -e "${DPKG_ROOT}$CONFFILE.dpkg-backup" ]; then
+		echo "Reinstalling ${DPKG_ROOT}$CONFFILE that was backupped"
+		mv "${DPKG_ROOT}$CONFFILE.dpkg-backup" "${DPKG_ROOT}$CONFFILE"
 	fi
 }
 
@@ -188,16 +188,16 @@ prepare_mv_conffile() {
 	local CONFFILE="$1"
 	local PACKAGE="$2"
 
-	[ -e "$CONFFILE" ] || return 0
+	[ -e "${DPKG_ROOT}$CONFFILE" ] || return 0
 
 	ensure_package_owns_file "$PACKAGE" "$CONFFILE" || return 0
 
 	local md5sum old_md5sum
-	md5sum="$(md5sum "$CONFFILE" | sed -e 's/ .*//')"
+	md5sum="$(md5sum "${DPKG_ROOT}$CONFFILE" | sed -e 's/ .*//')"
 	old_md5sum="$(dpkg-query -W -f='${Conffiles}' "$PACKAGE" | \
 		sed -n -e "\'^ $CONFFILE ' { s/ obsolete$//; s/.* //; p }")"
 	if [ "$md5sum" = "$old_md5sum" ]; then
-		mv -f "$CONFFILE" "$CONFFILE.dpkg-remove"
+		mv -f "${DPKG_ROOT}$CONFFILE" "${DPKG_ROOT}$CONFFILE.dpkg-remove"
 	fi
 }
 
@@ -206,16 +206,16 @@ finish_mv_conffile() {
 	local NEWCONFFILE="$2"
 	local PACKAGE="$3"
 
-	rm -f "$OLDCONFFILE.dpkg-remove"
+	rm -f "${DPKG_ROOT}$OLDCONFFILE.dpkg-remove"
 
-	[ -e "$OLDCONFFILE" ] || return 0
+	[ -e "${DPKG_ROOT}$OLDCONFFILE" ] || return 0
 	ensure_package_owns_file "$PACKAGE" "$OLDCONFFILE" || return 0
 
-	echo "Preserving user changes to $NEWCONFFILE (renamed from $OLDCONFFILE)..."
-	if [ -e "$NEWCONFFILE" ]; then
-		mv -f "$NEWCONFFILE" "$NEWCONFFILE.dpkg-new"
+	echo "Preserving user changes to ${DPKG_ROOT}$NEWCONFFILE (renamed from ${DPKG_ROOT}$OLDCONFFILE)..."
+	if [ -e "${DPKG_ROOT}$NEWCONFFILE" ]; then
+		mv -f "${DPKG_ROOT}$NEWCONFFILE" "${DPKG_ROOT}$NEWCONFFILE.dpkg-new"
 	fi
-	mv -f "$OLDCONFFILE" "$NEWCONFFILE"
+	mv -f "${DPKG_ROOT}$OLDCONFFILE" "${DPKG_ROOT}$NEWCONFFILE"
 }
 
 abort_mv_conffile() {
@@ -224,9 +224,9 @@ abort_mv_conffile() {
 
 	ensure_package_owns_file "$PACKAGE" "$CONFFILE" || return 0
 
-	if [ -e "$CONFFILE.dpkg-remove" ]; then
-		echo "Reinstalling $CONFFILE that was moved away"
-		mv "$CONFFILE.dpkg-remove" "$CONFFILE"
+	if [ -e "${DPKG_ROOT}$CONFFILE.dpkg-remove" ]; then
+		echo "Reinstalling ${DPKG_ROOT}$CONFFILE that was moved away"
+		mv "${DPKG_ROOT}$CONFFILE.dpkg-remove" "${DPKG_ROOT}$CONFFILE"
 	fi
 }
 
-- 
2.8.1

Attachment: signature.asc
Description: PGP signature

Reply via email to