]> granicus.if.org Git - php/commitdiff
Fixed segfault + ZTS
authorBob Weinand <bobwei9@hotmail.com>
Fri, 22 Nov 2013 18:16:25 +0000 (19:16 +0100)
committerBob Weinand <bobwei9@hotmail.com>
Fri, 22 Nov 2013 18:16:25 +0000 (19:16 +0100)
phpdbg_frame.c
phpdbg_frame.h
phpdbg_prompt.c

index aeda9ed303f914d8e24b826232dd5f0bb0a740cb..536debfe012494fd4e4b909a4cac4843bf5def63 100644 (file)
@@ -28,7 +28,7 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg);
 #define PHPDBG_FRAME(v) (PHPDBG_G(frame).v)
 #define PHPDBG_EX(v) (EG(current_execute_data)->v)
 
-void switch_to_frame(int frame) {
+void switch_to_frame(int frame TSRMLS_DC) {
        zend_execute_data *execute_data = PHPDBG_FRAME(num)?PHPDBG_FRAME(execute_data):EG(current_execute_data);
        int i = 0;
 
@@ -52,7 +52,7 @@ void switch_to_frame(int frame) {
                return;
        }
 
-       restore_frame();
+       restore_frame(TSRMLS_C);
 
        if (frame > 0) {
                PHPDBG_FRAME(num) = frame;
@@ -63,6 +63,7 @@ void switch_to_frame(int frame) {
 
                EG(opline_ptr) = &PHPDBG_EX(opline);
                EG(active_op_array) = PHPDBG_EX(op_array);
+               PHPDBG_FRAME(execute_data)->original_return_value = EG(return_value_ptr_ptr);
                EG(return_value_ptr_ptr) = PHPDBG_EX(original_return_value);
                EG(active_symbol_table) = PHPDBG_EX(symbol_table);
                EG(This) = PHPDBG_EX(current_this);
@@ -80,7 +81,7 @@ void switch_to_frame(int frame) {
        );
 }
 
-void restore_frame() {
+void restore_frame(TSRMLS_D) {
        if (PHPDBG_FRAME(num) == 0) {
                return;
        }
index 39efbf18f3303a9aeed408c9a5a63d69b4b3077e..49cdbcfe701d746a98b4787240aa62890fbe41b4 100644 (file)
@@ -29,8 +29,8 @@ typedef struct {
        zend_execute_data *execute_data;
 } phpdbg_frame;
 
-void switch_to_frame(int frame);
+void switch_to_frame(int frame TSRMLS_DC);
 
-void restore_frame();
+void restore_frame(TSRMLS_D);
 
 #endif /* PHPDBG_FRAME_H */
index 27f0b739914fb3c2f9cd0408ab134e5243293720..a5dca20113f80e2b1bdc4e9fd8200789bb7f4d41 100644 (file)
@@ -376,7 +376,7 @@ PHPDBG_COMMAND(frame) /* {{{ */
 {
        switch (param->type) {
                case NUMERIC_PARAM:
-                       switch_to_frame(param->num);
+                       switch_to_frame(param->num TSRMLS_CC);
                        break;
 
                case EMPTY_PARAM:
@@ -1077,7 +1077,11 @@ last:
 
 out:
        phpdbg_destroy_input(&input TSRMLS_CC);
-       
+
+       if (EG(in_execution)) {
+               restore_frame(TSRMLS_C);
+       }
+
        PHPDBG_G(flags) &= ~PHPDBG_IS_INTERACTIVE;
 
        return ret;