lkml.org 
[lkml]   [2024]   [Jan]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 6.6 18/31] libsubcmd: Fix memory leak in uniq()
    Date
    From: Ian Rogers <irogers@google.com>

    [ Upstream commit ad30469a841b50dbb541df4d6971d891f703c297 ]

    uniq() will write one command name over another causing the overwritten
    string to be leaked. Fix by doing a pass that removes duplicates and a
    second that removes the holes.

    Signed-off-by: Ian Rogers <irogers@google.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Chenyuan Mi <cymi20@fudan.edu.cn>
    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>
    Link: https://lore.kernel.org/r/20231208000515.1693746-1-irogers@google.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    tools/lib/subcmd/help.c | 18 ++++++++++++++----
    1 file changed, 14 insertions(+), 4 deletions(-)

    diff --git a/tools/lib/subcmd/help.c b/tools/lib/subcmd/help.c
    index adfbae27dc36..8561b0f01a24 100644
    --- a/tools/lib/subcmd/help.c
    +++ b/tools/lib/subcmd/help.c
    @@ -52,11 +52,21 @@ void uniq(struct cmdnames *cmds)
    if (!cmds->cnt)
    return;

    - for (i = j = 1; i < cmds->cnt; i++)
    - if (strcmp(cmds->names[i]->name, cmds->names[i-1]->name))
    - cmds->names[j++] = cmds->names[i];
    -
    + for (i = 1; i < cmds->cnt; i++) {
    + if (!strcmp(cmds->names[i]->name, cmds->names[i-1]->name))
    + zfree(&cmds->names[i - 1]);
    + }
    + for (i = 0, j = 0; i < cmds->cnt; i++) {
    + if (cmds->names[i]) {
    + if (i == j)
    + j++;
    + else
    + cmds->names[j++] = cmds->names[i];
    + }
    + }
    cmds->cnt = j;
    + while (j < i)
    + cmds->names[j++] = NULL;
    }

    void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes)
    --
    2.43.0

    \
     
     \ /
      Last update: 2024-05-27 14:37    [W:4.455 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site