]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
malloc: Improve free checks
authorWilco Dijkstra <wilco.dijkstra@arm.com>
Mon, 31 Mar 2025 11:44:02 +0000 (11:44 +0000)
committerWilco Dijkstra <wilco.dijkstra@arm.com>
Tue, 15 Apr 2025 11:14:57 +0000 (11:14 +0000)
The checks on size can be merged and use __builtin_add_overflow.  Since
tcache only handles small sizes (and rejects sizes < MINSIZE), delay this
check until after tcache.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
malloc/malloc.c

index e827875acc513a5c8bc3b638ec9e3f17542496a0..19b6cfafa07daa00f20702cf46353fa3ab536167 100644 (file)
@@ -3468,16 +3468,8 @@ __libc_free (void *mem)
 
   INTERNAL_SIZE_T size = chunksize (p);
 
-  /* Little security check which won't hurt performance: the
-     allocator never wraps around at the end of the address space.
-     Therefore we can exclude some size values which might appear
-     here by accident or by "design" from some intruder.  */
-  if (__glibc_unlikely ((uintptr_t) p > (uintptr_t) -size
-      || misaligned_chunk (p)))
+  if (__glibc_unlikely (misaligned_chunk (p)))
     malloc_printerr ("free(): invalid pointer");
-  /* We know that each chunk is at least MINSIZE bytes.  */
-  if (__glibc_unlikely (size < MINSIZE))
-    malloc_printerr ("free(): invalid size");
 
   check_inuse_chunk (arena_for_chunk (p), p);
 
@@ -3486,6 +3478,11 @@ __libc_free (void *mem)
     return;
 #endif
 
+  /* Check size >= MINSIZE and p + size does not overflow.  */
+  if (__glibc_unlikely (__builtin_add_overflow_p ((uintptr_t) p, size - MINSIZE,
+                                                 (uintptr_t) 0)))
+    malloc_printerr ("free(): invalid size");
+
   _int_free_chunk (arena_for_chunk (p), p, size, 0);
 }
 libc_hidden_def (__libc_free)