From: Ondřej Surý Date: Wed, 23 Aug 2023 06:56:22 +0000 (+0200) Subject: Checked array allocation arithmetic with isc_mem_get and friends X-Git-Tag: v9.19.17~18^2~6 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6272482113ff2f2d3de333e56eb9c63e36b8cc8f;p=thirdparty%2Fbind9.git Checked array allocation arithmetic with isc_mem_get and friends Add new isc_mem_cget(), isc_mem_creget(), and isc_mem_cput() macros to complement the isc_mem_callocate() (which works like calloc()). The overflow checks are implemented as macros in the , so that the compiler can see that the element size is constant: it should always be `sizeof(something)`. --- diff --git a/lib/isc/include/isc/mem.h b/lib/isc/include/isc/mem.h index 8ba4169547f..9dde53c6d5f 100644 --- a/lib/isc/include/isc/mem.h +++ b/lib/isc/include/isc/mem.h @@ -21,6 +21,7 @@ #include #include #include +#include #include ISC_LANG_BEGINDECLS @@ -154,17 +155,25 @@ extern unsigned int isc_mem_defaultflags; #endif #define ISC_MEM_ZERO ((int)0x40) -#define isc_mem_get(c, s) isc__mem_get((c), (s), 0 _ISC_MEM_FILELINE) +#define isc_mem_get(c, s) isc__mem_get((c), (s), 0 _ISC_MEM_FILELINE) +#define isc_mem_cget(c, n, s) \ + isc__mem_get((c), ISC_CHECKED_MUL((n), (s)), \ + ISC_MEM_ZERO _ISC_MEM_FILELINE) #define isc_mem_getx(c, s, f) isc__mem_get((c), (s), (f)_ISC_MEM_FILELINE) #define isc_mem_reget(c, p, o, n) \ isc__mem_reget((c), (p), (o), (n), 0 _ISC_MEM_FILELINE) +#define isc_mem_creget(c, p, o, n, s) \ + isc__mem_reget((c), (p), ISC_CHECKED_MUL((o), (s)), \ + ISC_CHECKED_MUL((n), (s)), \ + ISC_MEM_ZERO _ISC_MEM_FILELINE) #define isc_mem_regetx(c, p, o, n, f) \ isc__mem_reget((c), (p), (o), (n), (f)_ISC_MEM_FILELINE) #define isc_mem_allocate(c, s) isc__mem_allocate((c), (s), 0 _ISC_MEM_FILELINE) #define isc_mem_allocatex(c, s, f) \ isc__mem_allocate((c), (s), (f)_ISC_MEM_FILELINE) -#define isc_mem_callocate(c, n, s) \ - isc__mem_callocate((c), (n), (s), 0 _ISC_MEM_FILELINE) +#define isc_mem_callocate(c, n, s) \ + isc__mem_allocate((c), ISC_CHECKED_MUL((n), (s)), \ + ISC_MEM_ZERO _ISC_MEM_FILELINE) #define isc_mem_reallocate(c, p, s) \ isc__mem_reallocate((c), (p), (s), 0 _ISC_MEM_FILELINE) #define isc_mem_reallocatex(c, p, s, f) \ @@ -179,6 +188,12 @@ extern unsigned int isc_mem_defaultflags; isc__mem_put((c), (p), (s), 0 _ISC_MEM_FILELINE); \ (p) = NULL; \ } while (0) +#define isc_mem_cput(c, p, n, s) \ + do { \ + isc__mem_put((c), (p), ISC_CHECKED_MUL((n), (s)), \ + ISC_MEM_ZERO _ISC_MEM_FILELINE); \ + (p) = NULL; \ + } while (0) #define isc_mem_putx(c, p, s, f) \ do { \ isc__mem_put((c), (p), (s), (f)_ISC_MEM_FILELINE); \ @@ -517,10 +532,6 @@ ISC_ATTR_MALLOC_DEALLOCATOR_IDX(isc__mem_free, 2) void * isc__mem_allocate(isc_mem_t *, size_t, int _ISC_MEM_FLARG); -ISC_ATTR_MALLOC_DEALLOCATOR_IDX(isc__mem_free, 2) -void * -isc__mem_callocate(isc_mem_t *, size_t, size_t, int _ISC_MEM_FLARG); - ISC_ATTR_DEALLOCATOR_IDX(isc__mem_free, 2) void * isc__mem_reallocate(isc_mem_t *, void *, size_t, int _ISC_MEM_FLARG); diff --git a/lib/isc/mem.c b/lib/isc/mem.c index b03e1122d0b..4199428f2e5 100644 --- a/lib/isc/mem.c +++ b/lib/isc/mem.c @@ -819,13 +819,6 @@ isc__mem_allocate(isc_mem_t *ctx, size_t size, int flags FLARG) { return (ptr); } -void * -isc__mem_callocate(isc_mem_t *ctx, size_t count, size_t size, int flags FLARG) { - size_t bytes = ISC_CHECKED_MUL(count, size); - return (isc__mem_allocate(ctx, bytes, - (flags | ISC_MEM_ZERO) FLARG_PASS)); -} - void * isc__mem_reget(isc_mem_t *ctx, void *old_ptr, size_t old_size, size_t new_size, int flags FLARG) {