]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib: darr: fix bug with nested macro use 17648/head
authorChristian Hopps <chopps@labn.net>
Mon, 16 Dec 2024 02:37:41 +0000 (21:37 -0500)
committerChristian Hopps <chopps@labn.net>
Mon, 16 Dec 2024 03:01:56 +0000 (22:01 -0500)
- WHen declaring macro scoped variables, can run into problem if the macro
variable passed in has the same name as the new variable introduced in the inner
scope. We don't get a warning and the uses will be wrong.

e.g.,

```

{
    int __len = 10;
    foo(__len); // => 10 and not 15 as we wanted.
}
```

Signed-off-by: Christian Hopps <chopps@labn.net>
lib/darr.h

index 2b9a0a0c025b5177bbe31d652c2d004a54c4a762..121e3dd14e54920c9cc3e9764ed5c394c56b8811 100644 (file)
@@ -272,10 +272,10 @@ void *__darr_resize(void *a, uint count, size_t esize, struct memtype *mt);
  */
 #define darr_ensure_avail_mt(A, S, MT)                                         \
        ({                                                                     \
-               ssize_t need = (ssize_t)(S) -                                  \
-                              (ssize_t)(darr_cap(A) - darr_len(A));           \
-               if (need > 0)                                                  \
-                       _darr_resize_mt((A), darr_cap(A) + need, MT);          \
+               ssize_t __dea_need = (ssize_t)(S) -                            \
+                                    (ssize_t)(darr_cap(A) - darr_len(A));     \
+               if (__dea_need > 0)                                            \
+                       _darr_resize_mt((A), darr_cap(A) + __dea_need, MT);    \
                (A);                                                           \
        })
 #define darr_ensure_avail(A, S) darr_ensure_avail_mt(A, S, MTYPE_DARR)
@@ -301,9 +301,9 @@ void *__darr_resize(void *a, uint count, size_t esize, struct memtype *mt);
 #define darr_ensure_cap_mt(A, C, MT)                                           \
        ({                                                                     \
                /* Cast to avoid warning when C == 0 */                        \
-               uint _c = (C) > 0 ? (C) : 1;                                   \
-               if ((size_t)darr_cap(A) < _c)                                  \
-                       _darr_resize_mt((A), _c, MT);                          \
+               uint __dec_c = (C) > 0 ? (C) : 1;                              \
+               if ((size_t)darr_cap(A) < __dec_c)                             \
+                       _darr_resize_mt((A), __dec_c, MT);                     \
                (A);                                                           \
        })
 #define darr_ensure_cap(A, C) darr_ensure_cap_mt(A, C, MTYPE_DARR)
@@ -428,12 +428,12 @@ void *__darr_resize(void *a, uint count, size_t esize, struct memtype *mt);
 
 #define _darr_append_n(A, N, Z, MT)                                            \
        ({                                                                     \
-               uint __len = darr_len(A);                                      \
-               darr_ensure_cap_mt(A, __len + (N), MT);                        \
-               _darr_len(A) = __len + (N);                                    \
+               uint __da_len = darr_len(A);                                   \
+               darr_ensure_cap_mt(A, __da_len + (N), MT);                     \
+               _darr_len(A) = __da_len + (N);                                 \
                if (Z)                                                         \
-                       memset(&(A)[__len], 0, (N)*_darr_esize(A));            \
-               &(A)[__len];                                                   \
+                       memset(&(A)[__da_len], 0, (N)*_darr_esize(A));         \
+               &(A)[__da_len];                                                \
        })
 /**
  * Extending the array's length by N.