UB Sanitizer was flagging OBJECT_CONTAINING() as undefined behavior
due to the way it's used when iterating through collections, e.g.,
HMAP_FOR_EACH_INIT().  However, in such cases we don't actually
dereference the pointer, we just use its value.  Avoid the undefined
behavior by casting to 'void *' first.

Acked-by: Aaron Conole <acon...@redhat.com>
Signed-off-by: Dumitru Ceara <dce...@redhat.com>
---
v3:
- Added Aaron's ack.

Note: this is not a perfect fix because it will potentially hide some
UB.  The proper fix is probably something along the lines of Adrian's
series:
https://patchwork.ozlabs.org/project/openvswitch/list/?series=282481&state=*
---
 include/openvswitch/util.h |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/openvswitch/util.h b/include/openvswitch/util.h
index f45dc505164c..9a22ed56c505 100644
--- a/include/openvswitch/util.h
+++ b/include/openvswitch/util.h
@@ -128,7 +128,7 @@ OVS_NO_RETURN void ovs_assert_failure(const char *, const 
char *, const char *);
  * from the type of '*OBJECT'. */
 #define OBJECT_CONTAINING(POINTER, OBJECT, MEMBER)                      \
     ((OVS_TYPEOF(OBJECT)) (void *)                                      \
-     ((char *) (POINTER) - OBJECT_OFFSETOF(OBJECT, MEMBER)))
+     ((uintptr_t)(void *)(POINTER) - OBJECT_OFFSETOF(OBJECT, MEMBER)))
 
 /* Given POINTER, the address of the given MEMBER within an object of the type
  * that that OBJECT points to, assigns the address of the outer object to

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to