Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PM / sleep: declare __tracedata symbols as char[] rather than char

Accessing more than one byte from a symbol declared simply 'char' is undefined
behavior, as reported by UBSAN:

UBSAN: Undefined behaviour in drivers/base/power/trace.c:178:18
load of address ffffffff8203fc78 with insufficient space
for an object of type 'char'

Avoid this by declaring the symbols as arrays.

Signed-off-by: Eric Biggers <ebiggers3@gmail.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

authored by

Eric Biggers and committed by
Rafael J. Wysocki
f9723837 388f7b1d

+2 -2
+2 -2
drivers/base/power/trace.c
··· 166 166 } 167 167 EXPORT_SYMBOL(generate_pm_trace); 168 168 169 - extern char __tracedata_start, __tracedata_end; 169 + extern char __tracedata_start[], __tracedata_end[]; 170 170 static int show_file_hash(unsigned int value) 171 171 { 172 172 int match; 173 173 char *tracedata; 174 174 175 175 match = 0; 176 - for (tracedata = &__tracedata_start ; tracedata < &__tracedata_end ; 176 + for (tracedata = __tracedata_start ; tracedata < __tracedata_end ; 177 177 tracedata += 2 + sizeof(unsigned long)) { 178 178 unsigned short lineno = *(unsigned short *)tracedata; 179 179 const char *file = *(const char **)(tracedata + 2);