Package: dpkg
Version: 1.18.23
As discussed on irc yesterday there is a bug in dpkg when a conffile
moves from pkg-a to pkg-b and the "dpkg --root=/dir" option is used.
The Ubuntu bugreport is
https://bugs.launchpad.net/ubuntu/+source/snapd/+bug/1673247
Attached is a patch for the dpkg-tests.git repository that reproduces
the issue and a patch (from Guillem Jover) that fixes the issue. I
tested the patch both against the minimal test-case and also against
the "real" issue we were seeing on the Ubuntu live-cd with ubiquity.
Thanks,
Michael
>From 4da6ee05156257972fc461b9e2b2634026354cc8 Mon Sep 17 00:00:00 2001
From: Michael Vogt <[email protected]>
Date: Fri, 17 Mar 2017 08:36:44 +0100
Subject: [PATCH] add test for LP:1673247
---
Makefile | 1 +
t-conffile-root-option/Makefile | 30 ++++++++++++++++++++++
.../pkg-conff-a.v1/DEBIAN/conffiles | 1 +
.../pkg-conff-a.v1/DEBIAN/control | 8 ++++++
.../pkg-conff-a.v1/test-conffile | 1 +
.../pkg-conff-a.v2/DEBIAN/control | 8 ++++++
.../pkg-conff-b.v1/DEBIAN/control | 8 ++++++
.../pkg-conff-b.v2/DEBIAN/conffiles | 1 +
.../pkg-conff-b.v2/DEBIAN/control | 8 ++++++
.../pkg-conff-b.v2/test-conffile | 1 +
10 files changed, 67 insertions(+)
create mode 100644 t-conffile-root-option/Makefile
create mode 100644 t-conffile-root-option/pkg-conff-a.v1/DEBIAN/conffiles
create mode 100644 t-conffile-root-option/pkg-conff-a.v1/DEBIAN/control
create mode 100644 t-conffile-root-option/pkg-conff-a.v1/test-conffile
create mode 100644 t-conffile-root-option/pkg-conff-a.v2/DEBIAN/control
create mode 100644 t-conffile-root-option/pkg-conff-b.v1/DEBIAN/control
create mode 100644 t-conffile-root-option/pkg-conff-b.v2/DEBIAN/conffiles
create mode 100644 t-conffile-root-option/pkg-conff-b.v2/DEBIAN/control
create mode 100644 t-conffile-root-option/pkg-conff-b.v2/test-conffile
diff --git a/Makefile b/Makefile
index 996fab1..75a34b9 100644
--- a/Makefile
+++ b/Makefile
@@ -137,6 +137,7 @@ TESTS_PASS += t-substvars
TESTS_PASS += t-failinst-failrm
TESTS_PASS += t-dir-extension-check
TESTS_PASS += t-multiarch
+TESTS_PASS += t-conffile-root-option
ifneq (,$(filter test-all,$(DPKG_TESTSUITE_OPTIONS)))
TESTS := $(TESTS_PASS) $(TESTS_FAIL) $(TESTS_MANUAL)
diff --git a/t-conffile-root-option/Makefile b/t-conffile-root-option/Makefile
new file mode 100644
index 0000000..bbbba0a
--- /dev/null
+++ b/t-conffile-root-option/Makefile
@@ -0,0 +1,30 @@
+TESTS_DEB := pkg-conff-a.v1 pkg-conff-a.v2 pkg-conff-b.v1 pkg-conff-b.v2
+
+include ../Test.mk
+
+TEST_CASES += test-conffile-travels-packages-no-rootdir test-conffile-travels-packages-rootdir
+
+test-case: $(TEST_CASES)
+
+test-conffile-travels-packages-no-rootdir:
+ # install base version
+ $(DPKG_INSTALL) pkg-conff-a.v1.deb pkg-conff-b.v1.deb
+ # instlal update, conffile traves from a to b
+ $(DPKG_INSTALL) pkg-conff-a.v2.deb pkg-conff-b.v2.deb
+ -$(DPKG_PURGE) pkg-conff-b
+ -$(DPKG_PURGE) pkg-conff-a
+
+test-conffile-travels-packages-rootdir:
+ # install base version
+ mkdir -p $(CURDIR)/target/var/lib/dpkg/info
+ mkdir -p $(CURDIR)/target/var/lib/dpkg/updates
+ touch $(CURDIR)/target/var/lib/dpkg/status
+ $(DPKG_INSTALL) --root=$(CURDIR)/target pkg-conff-a.v1.deb pkg-conff-b.v1.deb
+ # instlal update, conffile traves from a to b
+ $(DPKG_INSTALL) --root=$(CURDIR)/target pkg-conff-a.v2.deb pkg-conff-b.v2.deb
+ -$(DPKG_PURGE) --root=$(CURDIR)/target pkg-conff-b
+ -$(DPKG_PURGE) --root=$(CURDIR)/target pkg-conff-a
+
+test-clean:
+ -$(DPKG_PURGE) pkg-conff-a pkg-conff-b
+ -rm -rf $(CURDIR)/target
diff --git a/t-conffile-root-option/pkg-conff-a.v1/DEBIAN/conffiles b/t-conffile-root-option/pkg-conff-a.v1/DEBIAN/conffiles
new file mode 100644
index 0000000..4fad7e9
--- /dev/null
+++ b/t-conffile-root-option/pkg-conff-a.v1/DEBIAN/conffiles
@@ -0,0 +1 @@
+/test-conffile
diff --git a/t-conffile-root-option/pkg-conff-a.v1/DEBIAN/control b/t-conffile-root-option/pkg-conff-a.v1/DEBIAN/control
new file mode 100644
index 0000000..e97fe2e
--- /dev/null
+++ b/t-conffile-root-option/pkg-conff-a.v1/DEBIAN/control
@@ -0,0 +1,8 @@
+Package: pkg-conff-a
+Version: 1
+Section: test
+Priority: extra
+Maintainer: Dpkg Developers <[email protected]>
+Architecture: all
+Description: test package - conflicting conffile
+
diff --git a/t-conffile-root-option/pkg-conff-a.v1/test-conffile b/t-conffile-root-option/pkg-conff-a.v1/test-conffile
new file mode 100644
index 0000000..024da49
--- /dev/null
+++ b/t-conffile-root-option/pkg-conff-a.v1/test-conffile
@@ -0,0 +1 @@
+pkg-conff-a
diff --git a/t-conffile-root-option/pkg-conff-a.v2/DEBIAN/control b/t-conffile-root-option/pkg-conff-a.v2/DEBIAN/control
new file mode 100644
index 0000000..1174243
--- /dev/null
+++ b/t-conffile-root-option/pkg-conff-a.v2/DEBIAN/control
@@ -0,0 +1,8 @@
+Package: pkg-conff-a
+Version: 2
+Section: test
+Priority: extra
+Maintainer: Dpkg Developers <[email protected]>
+Architecture: all
+Description: test package - conflicting conffile
+
diff --git a/t-conffile-root-option/pkg-conff-b.v1/DEBIAN/control b/t-conffile-root-option/pkg-conff-b.v1/DEBIAN/control
new file mode 100644
index 0000000..6281f4d
--- /dev/null
+++ b/t-conffile-root-option/pkg-conff-b.v1/DEBIAN/control
@@ -0,0 +1,8 @@
+Package: pkg-conff-b
+Version: 1
+Section: test
+Priority: extra
+Maintainer: Dpkg Developers <[email protected]>
+Architecture: all
+Description: test package - conflicting conffile
+
diff --git a/t-conffile-root-option/pkg-conff-b.v2/DEBIAN/conffiles b/t-conffile-root-option/pkg-conff-b.v2/DEBIAN/conffiles
new file mode 100644
index 0000000..4fad7e9
--- /dev/null
+++ b/t-conffile-root-option/pkg-conff-b.v2/DEBIAN/conffiles
@@ -0,0 +1 @@
+/test-conffile
diff --git a/t-conffile-root-option/pkg-conff-b.v2/DEBIAN/control b/t-conffile-root-option/pkg-conff-b.v2/DEBIAN/control
new file mode 100644
index 0000000..7eddd27
--- /dev/null
+++ b/t-conffile-root-option/pkg-conff-b.v2/DEBIAN/control
@@ -0,0 +1,8 @@
+Package: pkg-conff-b
+Version: 2
+Section: test
+Priority: extra
+Maintainer: Dpkg Developers <[email protected]>
+Architecture: all
+Description: test package - conflicting conffile
+
diff --git a/t-conffile-root-option/pkg-conff-b.v2/test-conffile b/t-conffile-root-option/pkg-conff-b.v2/test-conffile
new file mode 100644
index 0000000..006fbc7
--- /dev/null
+++ b/t-conffile-root-option/pkg-conff-b.v2/test-conffile
@@ -0,0 +1 @@
+pkg-conff-b
--
2.9.3
diff --git i/src/archives.c w/src/archives.c
index d91a07588..5b7c575f5 100644
--- i/src/archives.c
+++ w/src/archives.c
@@ -875,14 +875,7 @@ tarobject(void *ctx, struct tar_entry *ti)
conff = conff->next) {
if (!conff->obsolete)
continue;
- if (stat(conff->name, &stabtmp)) {
- if (errno == ENOENT || errno == ENOTDIR || errno == ELOOP)
- continue;
- else
- ohshite(_("cannot stat file '%s'"), conff->name);
- }
- if (stabtmp.st_dev == stab.st_dev &&
- stabtmp.st_ino == stab.st_ino)
+ if (strcmp(conff->name, nifd->namenode->name) == 0)
break;
}
if (conff) {