]> err.no Git - dpkg/commitdiff
Fix double free in modstatdb_init, in the case that modstatdb_shutdown was
authorAdam Heath <doogie@debian.org>
Tue, 3 Sep 2002 23:36:47 +0000 (23:36 +0000)
committerAdam Heath <doogie@debian.org>
Tue, 3 Sep 2002 23:36:47 +0000 (23:36 +0000)
called previously.

ChangeLog
debian/changelog
lib/dbmodify.c

index 06dcb94fa5950d19ce614e8c299091496bda40a9..f2321fd81a1b0f46fec7037bebaa25846883dcb3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Sep  3 18:40:08 CDT 2002 Adam Heath <doogie@debian.org>
+
+  * lib/dbmodify.c: Fix double free in modstatdb_init, in the case that
+    modstatdb_shutdown was called previously.
+
 Tue Sep  3 18:37:45 CDT 2002 Adam Heath <doogie@debian.org>
 
   * lib/nfmalloc.c: Protect duplicate calls to obstack_free(),
index 15fe395d95b613e5799dbcabddef52d867418576..7e9c20686aa15168db083ef4be5126a267fb4173 100644 (file)
@@ -1,5 +1,8 @@
 dpkg (1.10.7) unstable; urgency=low
 
+  * Fix double free in modstatdb_init, in the case that modstatdb_shutdown
+    was called previously.  Closes: #159515.
+
  -- Adam Heath <doogie@debian.org>  UNRELEASED
 
 dpkg (1.10.6) unstable; urgency=low
index 2b69d3fdeaa77888b6c781cf8eb9419b456e9ec4..d31317b62ad0e84e7015c8b32fe113a35f64eb14 100644 (file)
@@ -119,13 +119,15 @@ static void createimptmp(void) {
   onerr_abort--;
 }
 
+const struct fni { const char *suffix; char **store; } fnis[]= {
+  {   STATUSFILE,                 &statusfile         },
+  {   AVAILFILE,                  &availablefile      },
+  {   UPDATESDIR IMPORTANTTMP,    &importanttmpfile   },
+  {   NULL, NULL                                      }
+};
+
 enum modstatdb_rw modstatdb_init(const char *adir, enum modstatdb_rw readwritereq) {
-  static const struct fni { const char *suffix; char **store; } fnis[]= {
-    {   STATUSFILE,                 &statusfile         },
-    {   AVAILFILE,                  &availablefile      },
-    {   UPDATESDIR IMPORTANTTMP,    &importanttmpfile   },
-    {   NULL, NULL                                      }
-  }, *fnip;
+  const struct fni *fnip;
   
   admindir= adir;
 
@@ -203,6 +205,7 @@ static void checkpoint(void) {
 }
 
 void modstatdb_shutdown(void) {
+  const struct fni *fnip;
   switch (cstatus) {
   case msdbrw_write:
     checkpoint();
@@ -218,9 +221,10 @@ void modstatdb_shutdown(void) {
     break;
   }
 
-  free(statusfile);
-  free(availablefile);
-  free(importanttmpfile);
+  for (fnip=fnis; fnip->suffix; fnip++) {
+    free(*fnip->store);
+    *fnip->store= NULL;
+  }
   free(updatefnbuf);
 }