[lttng-dev] [PATCH] Avoid calling caa_container_of on NULL pointer in cds_lfhash macros

Ondřej Surý via lttng-dev <[email protected]>
Newsgroups org.lttng.lists.lttng-dev
Message-ID <[email protected]>
The cds_lfht_for_each_entry and cds_lfht_for_each_entry_duplicate macros
would call caa_container_of() macro on NULL pointer.  This is not a
problem under normal circumstances as the check in the for loop fails
and the loop-statement is not called with invalid (pos) value.

However AddressSanitizer doesn't like that and complains about this:

    runtime error: applying non-zero offset 18446744073709551056 to null pointer

Move the cds_lfht_iter_get_node(iter) != NULL from the cond-expression
of the for loop into both init-clause and iteration-expression as
conditional operator and check for (pos) value in the cond-expression
instead.

Signed-off-by: Ondřej Surý <[email protected]>
---
 include/urcu/rculfhash.h | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/include/urcu/rculfhash.h b/include/urcu/rculfhash.h
index fbd33cc..aafc455 100644
--- a/include/urcu/rculfhash.h
+++ b/include/urcu/rculfhash.h
@@ -546,22 +546,22 @@ void cds_lfht_resize(struct cds_lfht *ht, unsigned long new_size);
 
 #define cds_lfht_for_each_entry(ht, iter, pos, member)			\
 	for (cds_lfht_first(ht, iter),					\
-			pos = caa_container_of(cds_lfht_iter_get_node(iter), \
-					__typeof__(*(pos)), member);	\
-		cds_lfht_iter_get_node(iter) != NULL;			\
+			pos = (cds_lfht_iter_get_node(iter) != NULL ? caa_container_of(cds_lfht_iter_get_node(iter), \
+					__typeof__(*(pos)), member) : NULL);	\
+		pos != NULL;			\
 		cds_lfht_next(ht, iter),				\
-			pos = caa_container_of(cds_lfht_iter_get_node(iter), \
-					__typeof__(*(pos)), member))
+			pos = (cds_lfht_iter_get_node(iter) != NULL ? caa_container_of(cds_lfht_iter_get_node(iter), \
+					__typeof__(*(pos)), member) : NULL)
 
 #define cds_lfht_for_each_entry_duplicate(ht, hash, match, key,		\
 				iter, pos, member)			\
 	for (cds_lfht_lookup(ht, hash, match, key, iter),		\
-			pos = caa_container_of(cds_lfht_iter_get_node(iter), \
-					__typeof__(*(pos)), member);	\
-		cds_lfht_iter_get_node(iter) != NULL;			\
+			pos = (cds_lfht_iter_get_node(iter) != NULL ? caa_container_of(cds_lfht_iter_get_node(iter), \
+					__typeof__(*(pos)), member) : NULL);	\
+		pos != NULL;			\
 		cds_lfht_next_duplicate(ht, match, key, iter),		\
-			pos = caa_container_of(cds_lfht_iter_get_node(iter), \
-					__typeof__(*(pos)), member))
+			pos = (cds_lfht_iter_get_node(iter) != NULL ? caa_container_of(cds_lfht_iter_get_node(iter), \
+					__typeof__(*(pos)), member) : NULL)
 
 #ifdef __cplusplus
 }
-- 
2.39.2

_______________________________________________
lttng-dev mailing list
[email protected]
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.