]> granicus.if.org Git - php/commitdiff
Disable RTLD_DEEPBIND when compiling with AddressSanitizer (-fsanitize=address).
authorOndřej Surý <ondrej@sury.org>
Thu, 16 Feb 2017 07:57:30 +0000 (08:57 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 16 Feb 2017 16:35:29 +0000 (17:35 +0100)
The AddressSanitizer doesn't support RTLD_DEEPBIND resulting in
erratic errors when deinitializing phar module and possibly others.

Clang use __has_feature() macro to indicate compilation with
AddressSanitizer while gcc uses __SANITIZE_ADDRESS__ define.

Fixes bug #73677.

NEWS
Zend/zend_portability.h

diff --git a/NEWS b/NEWS
index 9b9b4522e911bcf35ffd22533e6c3005bca985fc..4c73dbfbe6141983a16687da61f6e07acbcaf84f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,8 @@ PHP                                                                        NEWS
     get_object_vars). (mhagstrand)
   . Fixed bug #73954 (NAN check fails on Alpine Linux with musl). (Andrea)
   . Fixed bug #74039 (is_infinite(-INF) returns false). (Christian Schmidt)
+  . Fixed bug #73677 (Generating phar.phar core dump with gcc ASAN enabled
+    build). (ondrej)
 
 - Apache:
   . Fixed bug #61471 (Incomplete POST does not timeout but is passed to PHP).
index cce55b71b2f9adfbceaad265c388f098f25b02ef..9914621a49cdc715662c082fb77e001de3cebce2 100644 (file)
 
 #if defined(HAVE_LIBDL) && !defined(ZEND_WIN32)
 
+# if defined(__has_feature)
+#  if __has_feature(address_sanitizer)
+#   define __SANITIZE_ADDRESS__
+#  endif
+# endif
+
 # ifndef RTLD_LAZY
 #  define RTLD_LAZY 1    /* Solaris 1, FreeBSD's (2.1.7.1 and older) */
 # endif
 
 # if defined(RTLD_GROUP) && defined(RTLD_WORLD) && defined(RTLD_PARENT)
 #  define DL_LOAD(libname)                     dlopen(libname, RTLD_LAZY | RTLD_GLOBAL | RTLD_GROUP | RTLD_WORLD | RTLD_PARENT)
-# elif defined(RTLD_DEEPBIND)
+# elif defined(RTLD_DEEPBIND) && !defined(__SANITIZE_ADDRESS__)
 #  define DL_LOAD(libname)                     dlopen(libname, RTLD_LAZY | RTLD_GLOBAL | RTLD_DEEPBIND)
 # else
 #  define DL_LOAD(libname)                     dlopen(libname, RTLD_LAZY | RTLD_GLOBAL)