mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/spinlock: Fix UBSAN "load of address with insufficient space" in lock_prof_init()
UBSAN complains:
(XEN) ================================================================================
(XEN) UBSAN: Undefined behaviour in common/spinlock.c:794:10
(XEN) load of address ffff82d040ae24c8 with insufficient space
(XEN) for an object of type 'struct lock_profile *'
(XEN) ----[ Xen-4.20-unstable x86_64 debug=y ubsan=y Tainted: C ]----
This shows up with GCC-14, but not with GCC-12. I have not bisected further.
Either way, the types for __lock_profile_{start,end} are incorrect.
They are an array of struct lock_profile pointers. Correct the extern's
types, and adjust the loop to match.
No practical change.
Reported-by: Andreas Glashauser <ag@andreasglashauser.com>
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
master commit: 542ac112fc
master date: 2024-10-14 16:14:26 +0100
This commit is contained in:
1 parent
05292f914f
commit
a756c242ea
1 file changed
+4
-4
@@ -607,9 +607,6 @@ struct lock_profile_anc {
|
||||
typedef void lock_profile_subfunc(struct lock_profile *data, int32_t type,
|
||||
int32_t idx, void *par);
|
||||
|
||||
extern struct lock_profile *__lock_profile_start;
|
||||
extern struct lock_profile *__lock_profile_end;
|
||||
|
||||
static s_time_t lock_profile_start;
|
||||
static struct lock_profile_anc lock_profile_ancs[] = {
|
||||
[LOCKPROF_TYPE_GLOBAL] = { .name = "Global" },
|
||||
@@ -779,13 +776,16 @@ void _lock_profile_deregister_struct(
|
||||
spin_unlock(&lock_profile_lock);
|
||||
}
|
||||
|
||||
extern struct lock_profile *__lock_profile_start[];
|
||||
extern struct lock_profile *__lock_profile_end[];
|
||||
|
||||
static int __init cf_check lock_prof_init(void)
|
||||
{
|
||||
struct lock_profile **q;
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(lock_profile_ancs) != LOCKPROF_TYPE_N);
|
||||
|
||||
for ( q = &__lock_profile_start; q < &__lock_profile_end; q++ )
|
||||
for ( q = __lock_profile_start; q < __lock_profile_end; q++ )
|
||||
{
|
||||
(*q)->next = lock_profile_glb_q.elem_q;
|
||||
lock_profile_glb_q.elem_q = *q;
|
||||
|
||||