lib subcmd: Avoid memory leak in exclude_cmds
authorIan Rogers <irogers@google.com>
Sun, 11 Jun 2023 23:36:06 +0000 (16:36 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 12 Jun 2023 21:18:13 +0000 (18:18 -0300)
exclude_cmds will shorten the cmds names array, before doing so free the
removed entry.

Signed-off-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: André Almeida <andrealmeid@igalia.com>
Cc: Darren Hart <dvhart@infradead.org>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20230611233610.953456-1-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/lib/subcmd/help.c

index bf02d62..a66fb1a 100644 (file)
@@ -66,6 +66,7 @@ void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes)
        while (ci < cmds->cnt && ei < excludes->cnt) {
                cmp = strcmp(cmds->names[ci]->name, excludes->names[ei]->name);
                if (cmp < 0) {
+                       zfree(&cmds->names[cj]);
                        cmds->names[cj++] = cmds->names[ci++];
                } else if (cmp == 0) {
                        ci++;
@@ -75,9 +76,12 @@ void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes)
                }
        }
 
-       while (ci < cmds->cnt)
+       while (ci < cmds->cnt) {
+               zfree(&cmds->names[cj]);
                cmds->names[cj++] = cmds->names[ci++];
-
+       }
+       for (ci = cj; ci < cmds->cnt; ci++)
+               zfree(&cmds->names[ci]);
        cmds->cnt = cj;
 }