1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Disable inlining and inter-procedure-analyses for zend_string_equal_val() function that may be overriden for valgrind (#13099)

This is a more safely way to fix GH-9068
This commit is contained in:
Dmitry Stogov
2024-01-09 20:05:51 +03:00
committed by Shivam Mathur
parent 2f2fb1fbf1
commit 9a2113a104

View File

@@ -366,6 +366,7 @@ ZEND_API void zend_interned_strings_switch_storage(bool request)
}
}
#if defined(__GNUC__) && (defined(__i386__) || (defined(__x86_64__) && !defined(__ILP32__)))
/* Even if we don't build with valgrind support, include the symbol so that valgrind available
* only at runtime will not result in false positives. */
#ifndef I_REPLACE_SONAME_FNNAME_ZU
@@ -373,29 +374,20 @@ ZEND_API void zend_interned_strings_switch_storage(bool request)
#endif
/* See GH-9068 */
#if defined(__GNUC__) && (__GNUC__ >= 11 || defined(__clang__)) && __has_attribute(no_caller_saved_registers)
# define NO_CALLER_SAVED_REGISTERS __attribute__((no_caller_saved_registers))
# ifndef __clang__
# pragma GCC push_options
# pragma GCC target ("general-regs-only")
# define POP_OPTIONS
# endif
#if __has_attribute(noipa)
# define NOIPA __attribute__((noipa))
#else
# define NO_CALLER_SAVED_REGISTERS
# define NOIPA
#endif
ZEND_API bool ZEND_FASTCALL NO_CALLER_SAVED_REGISTERS I_REPLACE_SONAME_FNNAME_ZU(NONE,zend_string_equal_val)(zend_string *s1, zend_string *s2)
ZEND_API bool ZEND_FASTCALL I_REPLACE_SONAME_FNNAME_ZU(NONE,zend_string_equal_val)(zend_string *s1, zend_string *s2)
{
return !memcmp(ZSTR_VAL(s1), ZSTR_VAL(s2), ZSTR_LEN(s1));
}
#ifdef POP_OPTIONS
# pragma GCC pop_options
# undef POP_OPTIONS
#endif
#if defined(__GNUC__) && defined(__i386__)
ZEND_API bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2)
ZEND_API zend_never_inline NOIPA bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2)
{
const char *ptr = ZSTR_VAL(s1);
uintptr_t delta = (uintptr_t) s2 - (uintptr_t) s1;
@@ -433,7 +425,7 @@ ZEND_API bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *
}
#elif defined(__GNUC__) && defined(__x86_64__) && !defined(__ILP32__)
ZEND_API bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2)
ZEND_API zend_never_inline NOIPA bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2)
{
const char *ptr = ZSTR_VAL(s1);
uintptr_t delta = (uintptr_t) s2 - (uintptr_t) s1;