[PATCH 55/73] asan: Fix volk_malloc alignment bug
authorAlexandreRouma <alexandre.rouma@gmail.com>
Thu, 30 Sep 2021 11:52:32 +0000 (13:52 +0200)
committerA. Maitland Bottoms <bottoms@debian.org>
Fri, 22 Oct 2021 03:30:05 +0000 (04:30 +0100)
ASAN (the Address Sanitizer used by GCC) requires memory allocations to
be a multiple of the alignment. To replicate the bug, use a version of
libvolk without this fix, call volk_malloc() with a number of byte
that's not a multiple of the alignment and compile it with the Address
sanitizer enable (-fsanitize=address). The software will error out
and complain about the alignement. This patch fixes it by adding the
missing number of bytes to the size variable so that it becomes a
multiple of the alignment.

Signed-off-by: AlexandreRouma <alexandre.rouma@gmail.com>
Gbp-Pq: Name 0055-asan-Fix-volk_malloc-alignment-bug.patch

lib/volk_malloc.c

index 8e84c14af1391f8cd03acccbf7bf8ed373315c43..f489ef872d55d2387842f43a0ac4e7eb1924b7a5 100644 (file)
 
 void* volk_malloc(size_t size, size_t alignment)
 {
+    if ((size == 0) || (alignment == 0)) {
+        fprintf(stderr, "VOLK: Error allocating memory: either size or alignment is 0");
+        return NULL;
+    }
+    // Tweak size to satisfy ASAN (the GCC address sanitizer).
+    // Calling 'volk_malloc' might therefor result in the allocation of more memory than
+    // requested for correct alignment. Any allocation size change here will in general not
+    // impact the end result since initial size alignment is required either way.
+    if (size % alignment) {
+        size += alignment - (size % alignment);
+    }
 #if HAVE_POSIX_MEMALIGN
     // quoting posix_memalign() man page:
     // "alignment must be a power of two and a multiple of sizeof(void *)"