CVE-2023-4154 replace: add ARRAY_INSERT_ELEMENT() helper
authorStefan Metzmacher <metze@samba.org>
Thu, 16 Mar 2023 08:57:43 +0000 (09:57 +0100)
committerJule Anger <janger@samba.org>
Mon, 9 Oct 2023 20:16:08 +0000 (22:16 +0200)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15424

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
(cherry picked from commit 9d8ff0d1e0b2ba7c84af36e1931f5bc99902a44b)

lib/replace/replace.h

index bd7f6e53e818689d12881ada491c0b50ccf4ae90..bcd5c09bf7cab57c84358635e7ca176b2b6ccc75 100644 (file)
@@ -889,6 +889,21 @@ typedef unsigned long long ptrdiff_t ;
 #define ARRAY_DEL_ELEMENT(a,i,n) \
 if((i)<((n)-1)){memmove(&((a)[(i)]),&((a)[(i)+1]),(sizeof(*(a))*((n)-(i)-1)));}
 
+/**
+ * Insert an array element by moving the rest one up
+ *
+ */
+#define ARRAY_INSERT_ELEMENT(__array,__old_last_idx,__new_elem,__new_idx) do { \
+       if ((__new_idx) < (__old_last_idx)) { \
+               const void *__src = &((__array)[(__new_idx)]); \
+               void *__dst = &((__array)[(__new_idx)+1]); \
+               size_t __num = (__old_last_idx)-(__new_idx); \
+               size_t __len = sizeof(*(__array)) * __num; \
+               memmove(__dst, __src, __len); \
+       } \
+       (__array)[(__new_idx)] = (__new_elem); \
+} while(0)
+
 /**
  * Pointer difference macro
  */