From: Stefan Metzmacher Date: Thu, 16 Mar 2023 08:57:43 +0000 (+0100) Subject: CVE-2023-4154 replace: add ARRAY_INSERT_ELEMENT() helper X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b59a4266f1b17d9aaf1485b09db15b911b470228;p=thirdparty%2Fsamba.git CVE-2023-4154 replace: add ARRAY_INSERT_ELEMENT() helper BUG: https://bugzilla.samba.org/show_bug.cgi?id=15424 Signed-off-by: Stefan Metzmacher Reviewed-by: Andrew Bartlett Reviewed-by: Douglas Bagnall (cherry picked from commit 9d8ff0d1e0b2ba7c84af36e1931f5bc99902a44b) --- diff --git a/lib/replace/replace.h b/lib/replace/replace.h index bd7f6e53e81..bcd5c09bf7c 100644 --- a/lib/replace/replace.h +++ b/lib/replace/replace.h @@ -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 */