aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--malloc/malloc.c13
2 files changed, 16 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index c256a53468..1f43736da5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
2002-08-03 Ulrich Drepper <drepper@redhat.com>
* assert/assert.c: Use hidden_def not INTDEF.
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) {