Origin: https://git.kernel.org/pub/scm/libs/klibc/klibc.git/commit/?id=
292650f04c2b5348b4efbad61fb014ed09b4f3f2
Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2021-31870
calloc() multiplies its 2 arguments together and passes the result to
malloc(). Since the factors and product both have type size_t, this
can result in an integer overflow and subsequent buffer overflow.
Check for this and fail if it happens.
CVE-2021-31870
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Gbp-Pq: Name 0037-klibc-calloc-Fail-if-multiplication-overflows.patch
* calloc.c
*/
+#include <errno.h>
#include <stdlib.h>
#include <string.h>
-/* FIXME: This should look for multiplication overflow */
-
void *calloc(size_t nmemb, size_t size)
{
- return zalloc(nmemb * size);
+ unsigned long prod;
+
+ if (__builtin_umull_overflow(nmemb, size, &prod)) {
+ errno = ENOMEM;
+ return NULL;
+ }
+ return zalloc(prod);
}