]> 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:47:28 +0000 (07:47 +0000)
committerDmitry Stogov <dmitry@php.net>
Fri, 2 Sep 2005 07:47:28 +0000 (07:47 +0000)
NEWS
Zend/tests/bug34260.phpt [new file with mode: 0755]
Zend/zend_execute_API.c

diff --git a/NEWS b/NEWS
index 0230796c5038ffde5ea8a6c51bceb44a2c915f3d..858b3270f9ceab9ee2a7ceb29d9f9143c9008ed7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -30,6 +30,8 @@ PHP                                                                        NEWS
 - Fixed bug #34277 (array_filter() crashes with references and objects).
   (Dmitry)
 - Fixed bug #34276 (setAttributeNS doesn't work with default namespace). (Rob)
+- Fixed bug #34260 (Segfault with callbacks (array_map) + overloading).
+  (Dmitry)
 - Fixed bug #34257 (lib64 not handled correctly in ming extension). (Marcus)
 - Fixed bug #34221 (Compiling xmlrpc as shared fails other parts). (Jani)
 - Fixed bug #34191 (ob_gzhandler does not enforce trailing \0). (Ilia)
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 4a131ccf296af1126de071955ea4aa19e21c638e..dcc1249f80754bca96072fa5d5f8ce42765c4559 100644 (file)
@@ -750,7 +750,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;