vppinfra: annotate pool_dup() for asan 54/34554/2
authorBenoît Ganne <bganne@cisco.com>
Fri, 19 Nov 2021 12:39:10 +0000 (13:39 +0100)
committerDamjan Marion <dmarion@me.com>
Mon, 22 Nov 2021 10:06:48 +0000 (10:06 +0000)
When using AddressSanitizer, pool objects are poisoned, but pool_dup()
deep copy is ok.

Type: fix

Change-Id: Id801c4ab35666474a297d885c4b92878e44feab6
Signed-off-by: Benoît Ganne <bganne@cisco.com>
src/vppinfra/pool.h

index 6f16e61..68a859e 100644 (file)
@@ -373,28 +373,30 @@ do {                                                                      \
  * @param A alignment (may be zero)
  * @return copy of pool
  */
-#define pool_dup_aligned(P,A)                                          \
-({                                                                     \
-  typeof (P) _pool_var (new) = 0;                                      \
-  pool_header_t * _pool_var (ph), * _pool_var (new_ph);                        \
-  u32 _pool_var (n) = pool_len (P);                                    \
-  if ((P))                                                             \
-    {                                                                  \
-      _pool_var (new) = _vec_resize (_pool_var (new), _pool_var (n),   \
-                                     _pool_var (n) * sizeof ((P)[0]),  \
-                                     pool_aligned_header_bytes, (A));  \
-      clib_memcpy_fast (_pool_var (new), (P),                          \
-                        _pool_var (n) * sizeof ((P)[0]));              \
-      _pool_var (ph) = pool_header (P);                                        \
-      _pool_var (new_ph) = pool_header (_pool_var (new));              \
-      _pool_var (new_ph)->free_bitmap =                                \
-        clib_bitmap_dup (_pool_var (ph)->free_bitmap);                 \
-      _pool_var (new_ph)->free_indices =                               \
-        vec_dup (_pool_var (ph)->free_indices);                                \
-      _pool_var (new_ph)->max_elts = _pool_var (ph)->max_elts;         \
-    }                                                                  \
-  _pool_var (new);                                                     \
-})
+#define pool_dup_aligned(P, A)                                                \
+  ({                                                                          \
+    typeof (P) _pool_var (new) = 0;                                           \
+    pool_header_t *_pool_var (ph), *_pool_var (new_ph);                       \
+    u32 _pool_var (n) = pool_len (P);                                         \
+    if ((P))                                                                  \
+      {                                                                       \
+       _pool_var (new) = _vec_resize (_pool_var (new), _pool_var (n),        \
+                                      _pool_var (n) * sizeof ((P)[0]),       \
+                                      pool_aligned_header_bytes, (A));       \
+       CLIB_MEM_OVERFLOW_PUSH ((P), _pool_var (n) * sizeof ((P)[0]));        \
+       clib_memcpy_fast (_pool_var (new), (P),                               \
+                         _pool_var (n) * sizeof ((P)[0]));                   \
+       CLIB_MEM_OVERFLOW_POP ();                                             \
+       _pool_var (ph) = pool_header (P);                                     \
+       _pool_var (new_ph) = pool_header (_pool_var (new));                   \
+       _pool_var (new_ph)->free_bitmap =                                     \
+         clib_bitmap_dup (_pool_var (ph)->free_bitmap);                      \
+       _pool_var (new_ph)->free_indices =                                    \
+         vec_dup (_pool_var (ph)->free_indices);                             \
+       _pool_var (new_ph)->max_elts = _pool_var (ph)->max_elts;              \
+      }                                                                       \
+    _pool_var (new);                                                          \
+  })
 
 /**
  * Return copy of pool without alignment