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

dpkg: Destroy the dpkg_error variables on warnings

The leak on cmpversions() does not pose any issue on normal operation as
the program will exit immediately and the memory will be freed by the
system, but once --command-fd is enabled, it could actually be a problem
due to a long running dpkg process leaking repeatedly.

The leak on parse_db_version() is actually problematic as it can act
repeatedly if there's tons of warnings when parsing.

Regression introduced in commit ccc26399f2f0e295da1206c5ce81fe81a5dc0e21.

Reported-by: Niels Thykier <niels@thykier.net>
Guillem Jover пре 15 година
родитељ
комит
5fc9084fd7
2 измењених фајлова са 4 додато и 0 уклоњено
  1. 2 0
      lib/dpkg/parsehelp.c
  2. 2 0
      src/enquiry.c

+ 2 - 0
lib/dpkg/parsehelp.c

@@ -287,6 +287,8 @@ parse_db_version(struct parsedb_state *ps, struct versionrevision *version,
     parse_warn(ps, "%s: %.250s", buf, err.str);
     parse_warn(ps, "%s: %.250s", buf, err.str);
   else
   else
     parse_error(ps, "%s: %.250s", buf, err.str);
     parse_error(ps, "%s: %.250s", buf, err.str);
+
+  dpkg_error_destroy(&err);
 }
 }
 
 
 void
 void

+ 2 - 0
src/enquiry.c

@@ -529,6 +529,7 @@ cmpversions(const char *const *argv)
         warning(_("version '%s' has bad syntax: %s"), argv[0], err.str);
         warning(_("version '%s' has bad syntax: %s"), argv[0], err.str);
       else
       else
         ohshit(_("version '%s' has bad syntax: %s"), argv[0], err.str);
         ohshit(_("version '%s' has bad syntax: %s"), argv[0], err.str);
+      dpkg_error_destroy(&err);
     }
     }
   } else {
   } else {
     blankversion(&a);
     blankversion(&a);
@@ -539,6 +540,7 @@ cmpversions(const char *const *argv)
         warning(_("version '%s' has bad syntax: %s"), argv[2], err.str);
         warning(_("version '%s' has bad syntax: %s"), argv[2], err.str);
       else
       else
         ohshit(_("version '%s' has bad syntax: %s"), argv[2], err.str);
         ohshit(_("version '%s' has bad syntax: %s"), argv[2], err.str);
+      dpkg_error_destroy(&err);
     }
     }
   } else {
   } else {
     blankversion(&b);
     blankversion(&b);