summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/changelog4
-rw-r--r--src/errors.c5
2 files changed, 7 insertions, 2 deletions
diff --git a/debian/changelog b/debian/changelog
index ff4096625..3169791a7 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -7,6 +7,10 @@ dpkg (1.18.14) UNRELEASED; urgency=medium
- Do not set PIE options if they have been negated, and do not reset
them if they have been requested.
Closes: #843791, #843826
+ * Fix use after free error in dpkg. It was trying to print messages that
+ had already been freed as part of the database memory pool, causing in
+ some cases segfaults when reporting the error summary at the end.
+ Regression introduced in dpkg 1.18.11. Closes: #843874
* Test suite:
- Do not fail tests on missing fakeroot, just skip them.
* Build system:
diff --git a/src/errors.c b/src/errors.c
index 086923500..3d2d71967 100644
--- a/src/errors.c
+++ b/src/errors.c
@@ -47,7 +47,7 @@ static int nerrs = 0;
struct error_report {
struct error_report *next;
- const char *what;
+ char *what;
};
static struct error_report *reports = NULL;
@@ -66,7 +66,7 @@ enqueue_error_report(const char *arg)
abort_processing = true;
nr= &emergency;
}
- nr->what= arg;
+ nr->what = m_strdup(arg);
nr->next = NULL;
*lastreport= nr;
lastreport= &nr->next;
@@ -109,6 +109,7 @@ reportbroken_retexitstatus(int ret)
fputs(_("Errors were encountered while processing:\n"),stderr);
while (reports) {
fprintf(stderr," %s\n",reports->what);
+ free(reports->what);
reports= reports->next;
}
}