mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
perf cs-etm: Reject CPU IDs that would overflow signed comparison
metadata[j][CS_ETM_CPU] is a u64 from perf.data, but the comparison
with max_cpu casts it to (int). A crafted value like 0xFFFFFFFF becomes
-1 after the cast, which compares less than max_cpu (0), so the queue
array is never sized to accommodate it. When the value is later passed
to cs_etm__get_queue(), it indexes queue_array with the original large
value, causing an out-of-bounds access.
Validate that CS_ETM_CPU fits in an int before using it in the signed
comparison.
Fixes: 57880a7966 ("perf: cs-etm: Allocate queues for all CPUs")
Reported-by: sashiko-bot <sashiko-bot@kernel.org>
Cc: James Clark <james.clark@arm.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Assisted-by: Claude:claude-opus-4.6
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
4a7500d772
commit
542e88a4c6
|
|
@ -6,6 +6,7 @@
|
|||
* Author: Mathieu Poirier <mathieu.poirier@linaro.org>
|
||||
*/
|
||||
|
||||
#include <limits.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/coresight-pmu.h>
|
||||
|
|
@ -3468,7 +3469,13 @@ int cs_etm__process_auxtrace_info_full(union perf_event *event,
|
|||
goto err_free_metadata;
|
||||
}
|
||||
|
||||
if ((int) metadata[j][CS_ETM_CPU] > max_cpu)
|
||||
/* CPU id comes from perf.data and must fit max_cpu + 1 without overflow */
|
||||
if (metadata[j][CS_ETM_CPU] >= INT_MAX) {
|
||||
err = -EINVAL;
|
||||
goto err_free_metadata;
|
||||
}
|
||||
|
||||
if ((int)metadata[j][CS_ETM_CPU] > max_cpu)
|
||||
max_cpu = metadata[j][CS_ETM_CPU];
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user