diff mbox series

[ovs-dev,v3,12/14] util: Avoid false positive UB when iterating collections.

Message ID 20220124142008.11777.70393.stgit@dceara.remote.csb
State Superseded
Headers show
Series Fix UndefinedBehaviorSanitizer reported issues and enable it in CI. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed

Commit Message

Dumitru Ceara Jan. 24, 2022, 2:20 p.m. UTC
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 <aconole@redhat.com>
Signed-off-by: Dumitru Ceara <dceara@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 mbox series

Patch

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