From: Ian Rogers > Sent: 11 September 2019 10:09 > On Wed, Jul 24, 2019 at 3:50 PM Numfor Mbiziwo-Tiapo <n...@google.com> wrote: > > > > The ubsan (undefined behavior sanitizer) build of perf throws an > > error when the synthesize "Synthesize cpu map" function from > > perf test is run. > > > > This can be reproduced by running (from the tip directory): > > make -C tools/perf USE_CLANG=1 EXTRA_CFLAGS="-fsanitize=undefined" > > > > (see cover letter for why perf may not build) > > > > then running: tools/perf/perf test 44 -v > > > > This bug occurs because the cpu_map_data__synthesize function in > > event.c calls synthesize_mask, casting the 'data' variable > > (of type cpu_map_data*) to a cpu_map_mask*. Since struct > > cpu_map_data is 2 byte aligned and struct cpu_map_mask is 8 byte > > aligned this causes memory alignment issues. > > > > This is fixed by adding 6 bytes of padding to the struct cpu_map_data, > > however, this will break compatibility between perf data files - a file > > written by an old perf wouldn't work with a perf with this patch due > > to event data alignment changing. > > > > Comments? > > > > Not-Quite-Signed-off-by: Numfor Mbiziwo-Tiapo <n...@google.com> > > --- > > tools/perf/util/event.h | 1 + > > 1 file changed, 1 insertion(+) > > > > diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h > > index eb95f3384958..82eaf06c2604 100644 > > --- a/tools/perf/util/event.h > > +++ b/tools/perf/util/event.h > > @@ -433,6 +433,7 @@ struct cpu_map_mask { > > > > struct cpu_map_data { > > u16 type; > > + u8 pad[6]; > > char data[]; > > }; > > > > -- > > 2.22.0.657.g960e92d24f-goog > > > An idea here is that, if this breaks backward compatibility, we > introduce an aligned variant and work to deprecate the unaligned > variant. I will look into making a patch set.
Adding a pad[6] makes no difference. You need to add aligened(8) to the structure itself as well. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)