From d9af917d070a049f6d3b50fadeed6883df0d4b9a Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 3 Aug 2002 18:59:41 +0000 Subject: [PATCH] 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. --- ChangeLog | 6 ++++++ malloc/malloc.c | 13 ++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index c256a53..1f43736 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +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. + 2002-08-03 Ulrich Drepper * assert/assert.c: Use hidden_def not INTDEF. diff --git a/malloc/malloc.c b/malloc/malloc.c index 0440be5..08b8e86 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) { -- 2.7.4