summaryrefslogtreecommitdiff
path: root/malloc/malloc.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2002-08-03 18:59:41 +0000
committerUlrich Drepper <drepper@redhat.com>2002-08-03 18:59:41 +0000
commitd9af917d070a049f6d3b50fadeed6883df0d4b9a (patch)
treed9bcecebb94e28e2f46cee04e1e7632941143172 /malloc/malloc.c
parent7abb683a13860d04d1c20cce1dde0f44f2aa4a3f (diff)
Update.
2002-08-03 Jakub Jelinek <jakub@redhat.com> Ulrich Drepper <drepper@redhat.com> * malloc/malloc.c (public_cALLOc): Only divide if at least one of arguments is big enough to cause an overflow.
Diffstat (limited to 'malloc/malloc.c')
-rw-r--r--malloc/malloc.c13
1 files changed, 10 insertions, 3 deletions
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) {