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.
This commit is contained in:
Nikita Popov 2019-06-28 17:15:56 +02:00
parent cf29c0f212
commit 2c8819b89c
2 changed files with 9 additions and 5 deletions

View File

@ -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

View File

@ -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