]> granicus.if.org Git - php/commitdiff
Fixed bug #34260 (Segfault with callbacks (array_map) + overloading)
authorDmitry Stogov <dmitry@php.net>
Fri, 2 Sep 2005 07:46:30 +0000 (07:46 +0000)
committerDmitry Stogov <dmitry@php.net>
Fri, 2 Sep 2005 07:46:30 +0000 (07:46 +0000)
NEWS
Zend/tests/bug34260.phpt [new file with mode: 0755]
Zend/zend_execute_API.c

diff --git a/NEWS b/NEWS
index 43abd52d58fc2df8cb7b97a02ff6c31684d343d5..418dade928802e051e73e4509b50c8a620771ad4 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -22,6 +22,8 @@ PHP                                                                        NEWS
   (Derick)
 - Fixed bug #34277 (array_filter() crashes with references and objects).
   (Dmitry)
+- Fixed bug #34260 (Segfault with callbacks (array_map) + overloading).
+  (Dmitry)
 - Fixed bug #34137 (assigning array element by reference causes binary mess).
   (Dmitry) 
 - Fixed bug #33957 (gmdate('W')/date('W') sometimes returns wrong week number).
diff --git a/Zend/tests/bug34260.phpt b/Zend/tests/bug34260.phpt
new file mode 100755 (executable)
index 0000000..fa393d0
--- /dev/null
@@ -0,0 +1,36 @@
+--TEST--
+Bug #34260 (Segfault with callbacks (array_map) + overloading)
+--FILE--
+<?php
+class Faulty
+{
+    function __call($Method,$Args)
+    {
+        switch($Method)
+        {
+            case 'seg':
+              echo "I hate me\n";
+            break;
+        }
+    }
+
+    function NormalMethod($Args)
+    {
+       echo "I heart me\n"; 
+    }
+}
+
+$Faulty = new Faulty();
+$Array = array('Some junk','Some other junk');
+
+// This causes a seg fault.
+$Failure = array_map(array($Faulty,'seg'),$Array);
+
+// This does not.
+$Failure = array_map(array($Faulty,'NormalMethod'),$Array);
+?>
+--EXPECT--
+I hate me
+I hate me
+I heart me
+I heart me
index 233dbfe3c04e071c92032cecdfa8c007386c765c..a83769ad624bf787ab77d061e9c2c16c8df8c8b8 100644 (file)
@@ -807,7 +807,9 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
                                return FAILURE;
                        }
                }
-               if (fci_cache) {
+               if (fci_cache &&
+                   (EX(function_state).function->type != ZEND_INTERNAL_FUNCTION ||
+                    ((zend_internal_function*)EX(function_state).function)->handler != zend_std_call_user_call)) {
                        fci_cache->function_handler = EX(function_state).function;
                        fci_cache->object_pp = fci->object_pp;
                        fci_cache->calling_scope = calling_scope;