]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
perf record: Fix memset out-of-range error
authorHaoze Xie <royenheart@gmail.com>
Sun, 7 Jul 2024 18:01:00 +0000 (02:01 +0800)
committerNamhyung Kim <namhyung@kernel.org>
Fri, 12 Jul 2024 16:38:40 +0000 (09:38 -0700)
Modified the object of 'memset' from '&lost.lost' to '&lost' in
record__read_lost_samples. This allows 'memset' to access memory properly
without causing out-of-bounds problems.

The problems got from builtin-record.c are:

In file included from /usr/include/string.h:495,
                 from util/parse-events.h:13,
                 from builtin-record.c:14:
In function 'memset',
    inlined from 'record__read_lost_samples' at
    builtin-record.c:1958:6,
    inlined from '__cmd_record.constprop' at builtin-record.c:2817:2:
/usr/include/x86_64-linux-gnu/bits/string_fortified.h:71:10: error:
'__builtin_memset' offset [17, 64] from the object at 'lost' is out
of the bounds of referenced subobject 'lost' with type
'struct perf_record_lost_samples' at offset 0 [-Werror=array-bounds]
71|return __builtin___memset_chk (__dest,__ch,__len,__bos0 (__dest));
  |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The error arised when performing a memset operation on the 'lost' variable,
the bytes of 'sizeof(lost)' exceeds that of '&lost.lost', which are 64
and 16.

Fixes: 6c1785cd75ef ("perf record: Ensure space for lost samples")
Signed-off-by: Haoze Xie <royenheart@gmail.com>
Signed-off-by: Yuan Tan <tanyuan@tinylab.org>
Link: https://lore.kernel.org/r/11e12f171b846577cac698cd3999db3d7f6c4d03.1720372317.git.royenheart@gmail.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/builtin-record.c

index 019305b94e5fc8b6b36223d708277bc6e17d98a4..a94516e8c522269e614492bf98b62d650551b0ba 100644 (file)
@@ -1955,7 +1955,7 @@ static void record__read_lost_samples(struct record *rec)
                                }
 
                                if (count.lost) {
-                                       memset(&lost.lost, 0, sizeof(lost));
+                                       memset(&lost, 0, sizeof(lost));
                                        lost.lost.header.type = PERF_RECORD_LOST_SAMPLES;
                                        __record__save_lost_samples(rec, evsel, &lost.lost,
                                                                    x, y, count.lost, 0);
@@ -1965,7 +1965,7 @@ static void record__read_lost_samples(struct record *rec)
 
                lost_count = perf_bpf_filter__lost_count(evsel);
                if (lost_count) {
-                       memset(&lost.lost, 0, sizeof(lost));
+                       memset(&lost, 0, sizeof(lost));
                        lost.lost.header.type = PERF_RECORD_LOST_SAMPLES;
                        __record__save_lost_samples(rec, evsel, &lost.lost, 0, 0, lost_count,
                                                    PERF_RECORD_MISC_LOST_SAMPLES_BPF);