From 2c8819b89cd305ed5013c7470934f3c5576d9348 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 28 Jun 2019 17:15:56 +0200 Subject: [PATCH] Disable ifunc resolvers if memory sanitizer is used Just marking them as no_sanitize("memory") is unforunately not sufficient, as the function still gets instrumented -- the attribute only disables reporting. --- Zend/zend_cpuinfo.h | 6 +----- Zend/zend_portability.h | 8 ++++++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Zend/zend_cpuinfo.h b/Zend/zend_cpuinfo.h index 87bc75c39a4..009944e7129 100644 --- a/Zend/zend_cpuinfo.h +++ b/Zend/zend_cpuinfo.h @@ -111,11 +111,7 @@ ZEND_API int zend_cpu_supports(zend_cpu_feature feature); * CPU support helpers from asan. * See also https://github.com/google/sanitizers/issues/342. */ #if __has_attribute(no_sanitize_address) -# if __has_feature(memory_sanitizer) -# define ZEND_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) __attribute__((no_sanitize("memory"))) -# else -# define ZEND_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) -# endif +# define ZEND_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) #else # define ZEND_NO_SANITIZE_ADDRESS #endif diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h index aae08a49c16..9416a362e36 100644 --- a/Zend/zend_portability.h +++ b/Zend/zend_portability.h @@ -524,6 +524,14 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */ /* Intrinsics macros start. */ +/* Memory sanitizer is incompatible with ifunc resolvers. Even if the resolver + * is marked as no_sanitize("memory") it will still be instrumented and crash. */ +#if defined(__has_feature) +# if __has_feature(memory_sanitizer) +# undef HAVE_FUNC_ATTRIBUTE_IFUNC +# endif +#endif + #if defined(HAVE_FUNC_ATTRIBUTE_IFUNC) && defined(HAVE_FUNC_ATTRIBUTE_TARGET) # define ZEND_INTRIN_HAVE_IFUNC_TARGET 1 #endif