Modify dl_list_for_each() to not use unaligned access with WPA_TRACE
UBSan testing with WPA_TRACE=y ended up hitting an unaligned access for struct os_alloc_trace in os_program_deinit() because of the dl_list_for_each() design that looked like dereferencing the member element of the list head which is something that does not exist. Get the first entry from the list using dl_list_first() so that the empty list special case is covefred and compare item pointers instead of struct dl_list pointers to check whether the end of the loop has been reached. Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
1415d4b82d
commit
3b6b3ae581
1 changed files with 3 additions and 3 deletions
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Doubly-linked list
|
* Doubly-linked list
|
||||||
* Copyright (c) 2009, Jouni Malinen <j@w1.fi>
|
* Copyright (c) 2009-2019, Jouni Malinen <j@w1.fi>
|
||||||
*
|
*
|
||||||
* This software may be distributed under the terms of the BSD license.
|
* This software may be distributed under the terms of the BSD license.
|
||||||
* See README for more details.
|
* See README for more details.
|
||||||
|
@ -76,8 +76,8 @@ static inline unsigned int dl_list_len(struct dl_list *list)
|
||||||
dl_list_entry((list)->prev, type, member))
|
dl_list_entry((list)->prev, type, member))
|
||||||
|
|
||||||
#define dl_list_for_each(item, list, type, member) \
|
#define dl_list_for_each(item, list, type, member) \
|
||||||
for (item = dl_list_entry((list)->next, type, member); \
|
for (item = dl_list_first((list), type, member); \
|
||||||
&item->member != (list); \
|
item && item != dl_list_entry((list), type, member); \
|
||||||
item = dl_list_entry(item->member.next, type, member))
|
item = dl_list_entry(item->member.next, type, member))
|
||||||
|
|
||||||
#define dl_list_for_each_safe(item, n, list, type, member) \
|
#define dl_list_for_each_safe(item, n, list, type, member) \
|
||||||
|
|
Loading…
Reference in a new issue