summaryrefslogtreecommitdiff
path: root/Zend/zend_alloc.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2008-07-24 13:46:28 +0000
committerDmitry Stogov <dmitry@php.net>2008-07-24 13:46:28 +0000
commit2cca3d0dd20eb58adbbee020095f989e164d63e5 (patch)
tree72c2dd336331617a22d2fbbf994cf36239df3393 /Zend/zend_alloc.c
parente29684a2cea5bf4f9f55eea5fa7f6262b8c00376 (diff)
downloadphp-git-2cca3d0dd20eb58adbbee020095f989e164d63e5.tar.gz
Optimized ZEND_SIGNED_MULTIPLY_LONG() (Matt)
Diffstat (limited to 'Zend/zend_alloc.c')
-rw-r--r--Zend/zend_alloc.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 856abc6711..67b415e056 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -2355,6 +2355,19 @@ static inline size_t safe_address(size_t nmemb, size_t size, size_t offset)
return res;
}
+#elif SIZEOF_SIZE_T == 4 && defined(HAVE_ZEND_LONG64)
+
+static inline size_t safe_address(size_t nmemb, size_t size, size_t offset)
+{
+ zend_ulong64 res = (zend_ulong64)nmemb * (zend_ulong64)size + (zend_ulong64)offset;
+
+ if (UNEXPECTED(res > (zend_ulong64)0xFFFFFFFFL)) {
+ zend_error_noreturn(E_ERROR, "Possible integer overflow in memory allocation (%zu * %zu + %zu)", nmemb, size, offset);
+ return 0;
+ }
+ return (size_t) res;
+}
+
#else
static inline size_t safe_address(size_t nmemb, size_t size, size_t offset)