summaryrefslogtreecommitdiff
path: root/backport-Fix-a-memleak-on-invalid-command-line-options.patch
diff options
context:
space:
mode:
Diffstat (limited to 'backport-Fix-a-memleak-on-invalid-command-line-options.patch')
-rw-r--r--backport-Fix-a-memleak-on-invalid-command-line-options.patch85
1 files changed, 85 insertions, 0 deletions
diff --git a/backport-Fix-a-memleak-on-invalid-command-line-options.patch b/backport-Fix-a-memleak-on-invalid-command-line-options.patch
new file mode 100644
index 0000000..faff556
--- /dev/null
+++ b/backport-Fix-a-memleak-on-invalid-command-line-options.patch
@@ -0,0 +1,85 @@
+From 1825dbf8244b129665a69481c4537a57b9e03a8f Mon Sep 17 00:00:00 2001
+From: Panu Matilainen <pmatilai@redhat.com>
+Date: Wed, 21 Feb 2024 16:07:05 +0200
+Subject: [PATCH] Fix a memleak on invalid command line options
+
+ The OS will clean it up yes, but in the meanwhile ASAN (when enabled)
+ blew up on your face and scared you silly. Use the opportunity to add a
+ test for a test on invalid option.
+
+---
+ lib/poptALL.c | 11 ++++++++---
+ tests/rpmgeneral.at | 10 +++++++++-
+ 2 files changed, 17 insertions(+), 4 deletions(-)
+
+diff --git a/lib/poptALL.c b/lib/poptALL.c
+index b24c13e..a2bbedc 100644
+--- a/lib/poptALL.c
++++ b/lib/poptALL.c
+@@ -296,7 +296,7 @@ rpmcliFini(poptContext optCon)
+ poptContext
+ rpmcliInit(int argc, char *const argv[], struct poptOption * optionsTable)
+ {
+- poptContext optCon;
++ poptContext optCon = NULL;
+ int rc;
+ const char *ctx, *execPath;
+
+@@ -336,14 +336,14 @@ rpmcliInit(int argc, char *const argv[], struct poptOption * optionsTable)
+ while ((rc = poptGetNextOpt(optCon)) > 0) {
+ fprintf(stderr, _("%s: option table misconfigured (%d)\n"),
+ xgetprogname(), rc);
+- exit(EXIT_FAILURE);
++ goto err;
+ }
+
+ if (rc < -1) {
+ fprintf(stderr, "%s: %s: %s\n", xgetprogname(),
+ poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
+ poptStrerror(rc));
+- exit(EXIT_FAILURE);
++ goto err;
+ }
+
+ /* Read rpm configuration (if not already read). */
+@@ -355,4 +355,9 @@ rpmcliInit(int argc, char *const argv[], struct poptOption * optionsTable)
+ }
+
+ return optCon;
++
++err:
++ poptFreeContext(optCon);
++ exit(EXIT_FAILURE);
++ return NULL; /* not reached */
+ }
+diff --git a/tests/rpmgeneral.at b/tests/rpmgeneral.at
+index cf1f507..4281315 100644
+--- a/tests/rpmgeneral.at
++++ b/tests/rpmgeneral.at
+@@ -26,7 +26,6 @@ RPMTEST_CHECK([runroot rpm --version],[0],
+ ])
+ RPMTEST_CLEANUP
+
+-
+ # ------------------------------
+ AT_SETUP([rpmbuild --version])
+ AT_KEYWORDS([basic])
+@@ -35,6 +34,15 @@ RPMTEST_CHECK([runroot rpmbuild --version],[0],
+ ])
+ RPMTEST_CLEANUP
+
++AT_SETUP([rpm invalid option])
++AT_KEYWORDS([basic])
++AT_CHECK([runroot rpm --badopt],
++[1],
++[],
++[rpm: --badopt: unknown option
++])
++AT_CLEANUP
++
+ # Check that libtool versioning matches expectations, it's easy to screw up.
+ AT_SETUP([rpm library version])
+ AT_KEYWORDS([basic])
+--
+2.33.0
+