Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 884b7462 authored by Ian Rogers's avatar Ian Rogers Committed by Greg Kroah-Hartman
Browse files

libsubcmd: Fix memory leak in uniq()



[ 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: default avatarIan 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 3e06e9b9
Loading
Loading
Loading
Loading
+14 −4
Original line number Diff line number Diff line
@@ -50,11 +50,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))
	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)