From f8527b6341a360039daedd896ed66818970622a7 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Mon, 3 Feb 2025 13:31:30 +0100 Subject: [PATCH] Implement zend_safe_address() for MSVC 64bit The 32bit implementation seems to be okay, but we rather should avoid falling back to the double (pun intended) calculation for non `__GNUC__` systems. We use the intsafe.h intrinsics instead for MSVC and compatible compilers. --- Zend/zend_multiply.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Zend/zend_multiply.h b/Zend/zend_multiply.h index 1eece465feefa..bdeb435d44319 100644 --- a/Zend/zend_multiply.h +++ b/Zend/zend_multiply.h @@ -290,6 +290,19 @@ static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, si return (size_t) res; } +#elif defined(_MSC_VER) + +static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, size_t offset, bool *overflow) +{ + size_t res; + if (UNEXPECTED(FAILED(ULongLongMult(nmemb, size, &res)) || FAILED(ULongLongAdd(res, offset, &res)))) { + *overflow = 1; + return 0; + } + *overflow = 0; + return res; +} + #else static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, size_t offset, bool *overflow)