From d9af917d070a049f6d3b50fadeed6883df0d4b9a Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 3 Aug 2002 18:59:41 +0000 Subject: Update. 2002-08-03 Jakub Jelinek Ulrich Drepper * malloc/malloc.c (public_cALLOc): Only divide if at least one of arguments is big enough to cause an overflow. --- malloc/malloc.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'malloc') diff --git a/malloc/malloc.c b/malloc/malloc.c index 0440be5c22..08b8e86794 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -488,6 +488,9 @@ Void_t *(*__morecore)(ptrdiff_t) = __default_morecore; #endif /* _LIBC */ #endif /* USE_DL_PREFIX */ +#ifndef _LIBC +#define __builtin_expect(expr, val) (expr) +#endif /* HAVE_MEMCPY should be defined if you are not otherwise using @@ -3466,9 +3469,13 @@ public_cALLOc(size_t n, size_t elem_size) /* size_t is unsigned so the behavior on overflow is defined. */ bytes = n * elem_size; - if (bytes / elem_size != n) { - MALLOC_FAILURE_ACTION; - return 0; +#define HALF_INTERNAL_SIZE_T \ + (((INTERNAL_SIZE_T) 1) << (8 * sizeof (INTERNAL_SIZE_T) / 2)) + if (__builtin_expect ((n | elem_size) >= HALF_INTERNAL_SIZE_T, 0)) { + if (bytes / elem_size != n) { + MALLOC_FAILURE_ACTION; + return 0; + } } if (hook != NULL) { -- cgit v1.2.3