Fix bug #70138 (difference between gcc and clang)
authorBob Weinand <bobwei9@hotmail.com>
Sun, 26 Jul 2015 19:49:11 +0000 (21:49 +0200)
committerBob Weinand <bobwei9@hotmail.com>
Sun, 26 Jul 2015 19:49:18 +0000 (21:49 +0200)
NEWS
sapi/phpdbg/phpdbg.c

diff --git a/NEWS b/NEWS
index 66441f745b83fc761e42f30f173e91c4532b5bbf..829f1bbc4f80af7eea546684b8df7a1314ad4a36 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,9 @@ PHP                                                                        NEWS
   . Fixed bug #70111 (Segfault when a function uses both an explicit return
     type and an explicit cast). (Laruence)
 
+- phpdbg
+  . Fixed bug #70138 (Segfault when displaying memory leaks). (Bob)
+
 23 Jul 2015, PHP 7.0.0 Beta 2
 
 - Core:
index 48e1b6ec06a9dd3248486d2af72e2e9b22eda4e1..d92f1ab4dc0663a56fa958f0cf5ebf924772ac7b 100644 (file)
@@ -1225,13 +1225,20 @@ void phpdbg_signal_handler(int sig, siginfo_t *info, void *context) /* {{{ */
 #endif
 
 
-/* A bit dark magic in order to have meaningful allocator adresses */
-#if ZEND_DEBUG && (__has_builtin(__builtin_frame_address) || ZEND_GCC_VERSION >= 3004)
-#define FETCH_PARENT_FILELINE(argsize) \
+/* A bit dark magic in order to have meaningful allocator adresses [ppc(64) may return bogus addresses here] */
+#if ZEND_DEBUG && (__has_builtin(__builtin_frame_address) || ZEND_GCC_VERSION >= 3004) && !defined(__ppc__) && !defined(__ppc64__)
+/* with gcc %rbp/%ebp for __builtin_frame_address() and clang returns the frame return address being at %ebp/%rbp + sizeof(void*) */
+# ifdef __clang__
+#  define FETCH_PARENT_START() \
+       parent -= ZEND_MM_ALIGNED_SIZE(sizeof(void *));
+# else
+#  define FETCH_PARENT_START()
+# endif
+# define FETCH_PARENT_FILELINE(argsize) \
        char *__zend_filename, *__zend_orig_filename; \
        uint __zend_lineno, __zend_orig_lineno; \
        void *parent = __builtin_frame_address(1U); \
-       parent -= ZEND_MM_ALIGNED_SIZE(sizeof(void *)); /* remove frame pointer adress */ \
+       FETCH_PARENT_START() \
        parent -= (argsize); /* size of first arguments */ \
        parent -= sizeof(char *); /* filename */ \
        __zend_filename = *(char **) parent; \
@@ -1245,11 +1252,11 @@ void phpdbg_signal_handler(int sig, siginfo_t *info, void *context) /* {{{ */
        parent -= sizeof(uint); /* orig_lineno */ \
        __zend_orig_lineno = *(uint *) parent;
 #elif ZEND_DEBUG
-#define FETCH_PARENT_FILELINE(argsize) \
+# define FETCH_PARENT_FILELINE(argsize) \
        char *__zend_filename = __FILE__, *__zend_orig_filename = NULL; \
        uint __zend_lineno = __LINE__, __zend_orig_lineno = 0;
 #else
-#define FETCH_PARENT_FILELINE(argsize)
+# define FETCH_PARENT_FILELINE(argsize)
 #endif
 
 void *phpdbg_malloc_wrapper(size_t size) /* {{{ */