]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
malloc: Check for integer overflow in valloc.
authorWill Newton <will.newton@linaro.org>
Fri, 16 Aug 2013 10:59:37 +0000 (11:59 +0100)
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Thu, 15 Jan 2015 20:00:41 +0000 (15:00 -0500)
A large bytes parameter to valloc could cause an integer overflow
and corrupt allocator internals. Check the overflow does not occur
before continuing with the allocation.

ChangeLog:

2013-09-11  Will Newton  <will.newton@linaro.org>

[BZ #15856]
* malloc/malloc.c (__libc_valloc): Check the value of bytes
does not overflow.

ChangeLog
malloc/malloc.c

index edf1a9cc27f2086eeafbebadc3304128cfad74be..bd8deafc6cad51f2761e292256301c1ee33e550f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2013-09-11  Will Newton  <will.newton@linaro.org>
+
+       [BZ #15856]
+       * malloc/malloc.c (__libc_valloc): Check the value of bytes
+       does not overflow.
+
 2013-09-11  Will Newton  <will.newton@linaro.org>
 
        [BZ #15855]
index ee89a67dbc53c1f9f54b92a5b05a5c531ab5ec5b..d5dacbf5bc3a899a8b20869b33528bac66dd2e6b 100644 (file)
@@ -3073,8 +3073,14 @@ __libc_valloc(size_t bytes)
 
   size_t pagesz = GLRO(dl_pagesize);
 
-  __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
-                                       const __malloc_ptr_t)) =
+  /* Check for overflow.  */
+  if (bytes > SIZE_MAX - pagesz - MINSIZE)
+    {
+      __set_errno (ENOMEM);
+      return 0;
+    }
+
+  void *(*hook) (size_t, size_t, const void *) =
     force_reg (__memalign_hook);
   if (__builtin_expect (hook != NULL, 0))
     return (*hook)(pagesz, bytes, RETURN_ADDRESS (0));