diff options
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.patch | 85 |
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 + |