mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 01:32:21 +02:00
perf pmu: Fix perf_pmu__parse_scale/unit() OOB access on empty sysfs file
perf_pmu__parse_scale() reads a PMU scale file then accesses
scale[sret - 1] to strip a trailing newline. Only sret < 0 is
guarded, so an empty file (sret == 0) causes scale[-1] — a stack
buffer underflow that reads and potentially writes out of bounds.
perf_pmu__parse_unit() has the same pattern: alias->unit[sret - 1]
with sret == 0 accesses the byte before the struct member, which
may corrupt the adjacent pmu_name pointer field.
Change both guards from sret < 0 to sret <= 0 so that empty files
are treated as read errors.
Fixes: 410136f5dd ("tools/perf/stat: Add event unit and scale support")
Reported-by: sashiko-bot <sashiko-bot@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Assisted-by: Claude:claude-opus-4.6
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
836455e6db
commit
33035f7dd4
|
|
@ -314,7 +314,7 @@ static int perf_pmu__parse_scale(struct perf_pmu *pmu, struct perf_pmu_alias *al
|
|||
goto error;
|
||||
|
||||
sret = read(fd, scale, sizeof(scale)-1);
|
||||
if (sret < 0)
|
||||
if (sret <= 0)
|
||||
goto error;
|
||||
|
||||
if (scale[sret - 1] == '\n')
|
||||
|
|
@ -346,7 +346,7 @@ static int perf_pmu__parse_unit(struct perf_pmu *pmu, struct perf_pmu_alias *ali
|
|||
return -1;
|
||||
|
||||
sret = read(fd, alias->unit, UNIT_MAX_LEN);
|
||||
if (sret < 0)
|
||||
if (sret <= 0)
|
||||
goto error;
|
||||
|
||||
close(fd);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user