[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[PATCH 4/4] Fix theoretical race in interrupted dpkg --configure



If deferred_configure_conffile() is interrupted after the
.dpkg-new file is removed but before its hash is recorded as the
distributed conffile hash, that hash is lost forever, and if it
is different from the previous one then the conffile will appear
to have been modified by the user the next time an upgrade
modifies that conffile.

Fixing this should avoid unnecessary prompting in some cases.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 src/configure.c |   14 +++++---------
 1 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/src/configure.c b/src/configure.c
index 29878e4..e4fffc9 100644
--- a/src/configure.c
+++ b/src/configure.c
@@ -183,10 +183,6 @@ deferred_configure_conffile(struct pkginfo *pkg, struct conffile *conff)
 			        pkg->name, cdr2.buf, cdr.buf, strerror(errno));
 		/* Fall through. */
 	case cfo_keep:
-		strcpy(cdr2rest, DPKGNEWEXT);
-		if (unlink(cdr2.buf))
-			warning(_("%s: failed to remove '%.250s': %s"),
-			        pkg->name, cdr2.buf, strerror(errno));
 		break;
 	case cfo_install | cfof_backup:
 		strcpy(cdr2rest, DPKGDISTEXT);
@@ -220,11 +216,6 @@ deferred_configure_conffile(struct pkginfo *pkg, struct conffile *conff)
 		if (rename(cdr2.buf, cdr.buf))
 			ohshite(_("unable to install `%.250s' as `%.250s'"),
 			        cdr2.buf, cdr.buf);
-		strcpy(cdr2rest, DPKGNEWEXT);
-		if (unlink(cdr2.buf))
-			warning(_("%s: failed to remove '%.250s': %s"),
-				pkg->name, cdr2.buf, strerror(errno));
-		break;
 	default:
 		internerr("unknown conffopt '%d'", what);
 	}
@@ -232,6 +223,11 @@ deferred_configure_conffile(struct pkginfo *pkg, struct conffile *conff)
 	conff->hash = nfstrsave(newdisthash);
 	modstatdb_note(pkg);
 
+	strcpy(cdr2rest, DPKGNEWEXT);
+	if (unlink(cdr2.buf))
+		warning(_("%s: failed to remove '%.250s': %s"),
+			pkg->name, cdr2.buf, strerror(errno));
+
 	varbuffree(&cdr);
 	varbuffree(&cdr2);
 }
-- 
1.6.5.2


Reply to: