summaryrefslogtreecommitdiffstats
path: root/src/include/list.h
diff options
context:
space:
mode:
authorPatrick Rudolph <siro@das-labor.org>2020-08-19 08:40:31 +0200
committerPatrick Rudolph <siro@das-labor.org>2020-11-03 09:11:21 +0000
commit88991caf00d3b8862bc3c1aa4497baeb67e910e6 (patch)
tree182b9056c56b2f648fab72e5f206c58f914922d1 /src/include/list.h
parente8e0418d984f0ba4a6754ce37d6fe8ecc7cd4a2f (diff)
downloadcoreboot-88991caf00d3b8862bc3c1aa4497baeb67e910e6.tar.gz
coreboot-88991caf00d3b8862bc3c1aa4497baeb67e910e6.tar.bz2
coreboot-88991caf00d3b8862bc3c1aa4497baeb67e910e6.zip
include/list.h: Add support for GCC9+
When getting the address of a structure's member that is not on offset 0, GCC9+ assumes that the address can never be NULL. However the code relied on the fact that it can be NULL by letting the pointer intentionally overflow. Manually calculate the address using uintptr_t. This allows to gracefully terminate the list_for_each MACRO instead of crashing at the end of the list. Tested on qemu-system-arm: coreboot no longer crashed in the devicetree parser and is able to boot Linux 5.5. Change-Id: I0d569b59a23d1269f8575fcbbe92a5a6816aa1f7 Signed-off-by: Patrick Rudolph <siro@das-labor.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/44573 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Nico Huber <nico.h@gmx.de> Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Diffstat (limited to 'src/include/list.h')
-rw-r--r--src/include/list.h8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/include/list.h b/src/include/list.h
index 394487831cfc..6f0b54d818de 100644
--- a/src/include/list.h
+++ b/src/include/list.h
@@ -16,10 +16,10 @@ void list_insert_after(struct list_node *node, struct list_node *after);
// Insert list_node node before list_node before in a doubly linked list.
void list_insert_before(struct list_node *node, struct list_node *before);
-#define list_for_each(ptr, head, member) \
- for ((ptr) = container_of((head).next, typeof(*(ptr)), member); \
- &((ptr)->member); \
- (ptr) = container_of((ptr)->member.next, \
+#define list_for_each(ptr, head, member) \
+ for ((ptr) = container_of((head).next, typeof(*(ptr)), member); \
+ (uintptr_t)ptr + (uintptr_t)offsetof(typeof(*(ptr)), member); \
+ (ptr) = container_of((ptr)->member.next, \
typeof(*(ptr)), member))
#endif /* __LIST_H__ */