Преглед изворни кода

dpkg: Reset the statoverrides from the in-core database on reload

If a statoverride gets removed in a maintainer script, it will not be
reflected on the database until after the current dpkg process has been
restarted. So we need to reset the statoverride information whenever we
are going to reload the statoverride database.
Guillem Jover пре 12 година
родитељ
комит
e679333198
2 измењених фајлова са 10 додато и 0 уклоњено
  1. 3 0
      debian/changelog
  2. 7 0
      src/statdb.c

+ 3 - 0
debian/changelog

@@ -6,6 +6,9 @@ dpkg (1.17.4) UNRELEASED; urgency=low
     inode numbers being different when checking if the databases need to
     be reloaded. Regression introduced in 1.17.2. Closes: #731524
   * Add debug output to diversions and statoverride database loading code.
+  * Reset the statoverrides information from the in-core database when
+    reloading it from disk, otherwise removals in maintainer scripts will
+    not be seen during the current dpkg run.
 
  -- Guillem Jover <guillem@debian.org>  Thu, 05 Dec 2013 11:08:49 +0100
 

+ 7 - 0
src/statdb.c

@@ -117,6 +117,7 @@ ensure_statoverrides(void)
 	char *loaded_list, *loaded_list_end, *thisline, *nextline, *ptr;
 	struct file_stat *fso;
 	struct filenamenode *fnn;
+	struct fileiterator *iter;
 
 	if (statoverridename == NULL)
 		statoverridename = dpkg_db_get_path(STATOVERRIDEFILE);
@@ -154,6 +155,12 @@ ensure_statoverrides(void)
 	}
 	file_prev = file;
 
+	/* Reset statoverride information. */
+	iter = files_db_iter_new();
+	while ((fnn = files_db_iter_next(iter)))
+		fnn->statoverride = NULL;
+	files_db_iter_free(iter);
+
 	if (!file) {
 		onerr_abort--;
 		debug(dbg_general, "%s: none, resetting", __func__);