]> granicus.if.org Git - php/commitdiff
- Fixed bug #46238 (Segmentation fault on static call with empty string method)
authorFelipe Pena <felipe@php.net>
Mon, 6 Oct 2008 00:35:20 +0000 (00:35 +0000)
committerFelipe Pena <felipe@php.net>
Mon, 6 Oct 2008 00:35:20 +0000 (00:35 +0000)
Zend/tests/bug46238.phpt [new file with mode: 0644]
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/Zend/tests/bug46238.phpt b/Zend/tests/bug46238.phpt
new file mode 100644 (file)
index 0000000..e8281f1
--- /dev/null
@@ -0,0 +1,120 @@
+--TEST--
+Bug #46238 (Segmentation fault on static call with empty string method)
+--FILE--
+<?php
+
+class a {
+        static function __callStatic($name, $arguments)
+        {
+                var_dump(array($name, $arguments));
+        }
+}
+
+$a = 'a';
+$b = '';
+
+$a::$b($a);
+$a::$b(array());
+$a::$b(NULL);
+$a::$b(1);
+$a::$b();
+
+
+$b = "\0";
+
+$a::$b($a);
+$a::$b(array());
+$a::$b(NULL);
+$a::$b(1);
+$a::$b();
+
+?>
+--EXPECT--
+array(2) {
+  [0]=>
+  unicode(0) ""
+  [1]=>
+  array(1) {
+    [0]=>
+    unicode(1) "a"
+  }
+}
+array(2) {
+  [0]=>
+  unicode(0) ""
+  [1]=>
+  array(1) {
+    [0]=>
+    array(0) {
+    }
+  }
+}
+array(2) {
+  [0]=>
+  unicode(0) ""
+  [1]=>
+  array(1) {
+    [0]=>
+    NULL
+  }
+}
+array(2) {
+  [0]=>
+  unicode(0) ""
+  [1]=>
+  array(1) {
+    [0]=>
+    int(1)
+  }
+}
+array(2) {
+  [0]=>
+  unicode(0) ""
+  [1]=>
+  array(0) {
+  }
+}
+array(2) {
+  [0]=>
+  unicode(0) ""
+  [1]=>
+  array(1) {
+    [0]=>
+    unicode(1) "a"
+  }
+}
+array(2) {
+  [0]=>
+  unicode(0) ""
+  [1]=>
+  array(1) {
+    [0]=>
+    array(0) {
+    }
+  }
+}
+array(2) {
+  [0]=>
+  unicode(0) ""
+  [1]=>
+  array(1) {
+    [0]=>
+    NULL
+  }
+}
+array(2) {
+  [0]=>
+  unicode(0) ""
+  [1]=>
+  array(1) {
+    [0]=>
+    int(1)
+  }
+}
+array(2) {
+  [0]=>
+  unicode(0) ""
+  [1]=>
+  array(0) {
+  }
+}
index e795d176086fec32f5d6bf6de8a8f30192a51b4a..1af730b51c841053b3520b64ffb0e845ecb689c9 100644 (file)
@@ -2038,7 +2038,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUS
                }
        }
        if(OP2_TYPE != IS_UNUSED) {
-               zstr function_name_strval;
+               zstr function_name_strval = NULL_ZSTR;
                unsigned int function_name_strlen = 0;
                zend_free_op free_op2;
                zend_uchar function_name_type;
@@ -2059,7 +2059,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUS
                        }
                }
 
-               if (function_name_strlen) {
+               if (function_name_strval.v) {
                        if (ce->get_static_method) {
                                EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
                        } else {
index 4f2fac5e90cac20da3cc088d250586e6aa93b490..1c4cb5663ecd5d9415a29887a557bedacd53b398 100644 (file)
@@ -2707,7 +2707,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(
                }
        }
        if(IS_CONST != IS_UNUSED) {
-               zstr function_name_strval;
+               zstr function_name_strval = NULL_ZSTR;
                unsigned int function_name_strlen = 0;
 
                zend_uchar function_name_type;
@@ -2728,7 +2728,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(
                        }
                }
 
-               if (function_name_strlen) {
+               if (function_name_strval.v) {
                        if (ce->get_static_method) {
                                EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
                        } else {
@@ -3311,7 +3311,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZE
                }
        }
        if(IS_TMP_VAR != IS_UNUSED) {
-               zstr function_name_strval;
+               zstr function_name_strval = NULL_ZSTR;
                unsigned int function_name_strlen = 0;
                zend_free_op free_op2;
                zend_uchar function_name_type;
@@ -3332,7 +3332,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZE
                        }
                }
 
-               if (function_name_strlen) {
+               if (function_name_strval.v) {
                        if (ce->get_static_method) {
                                EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
                        } else {
@@ -3791,7 +3791,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZE
                }
        }
        if(IS_VAR != IS_UNUSED) {
-               zstr function_name_strval;
+               zstr function_name_strval = NULL_ZSTR;
                unsigned int function_name_strlen = 0;
                zend_free_op free_op2;
                zend_uchar function_name_type;
@@ -3812,7 +3812,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZE
                        }
                }
 
-               if (function_name_strlen) {
+               if (function_name_strval.v) {
                        if (ce->get_static_method) {
                                EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
                        } else {
@@ -4027,7 +4027,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER
                }
        }
        if(IS_UNUSED != IS_UNUSED) {
-               zstr function_name_strval;
+               zstr function_name_strval = NULL_ZSTR;
                unsigned int function_name_strlen = 0;
 
                zend_uchar function_name_type;
@@ -4048,7 +4048,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER
                        }
                }
 
-               if (function_name_strlen) {
+               if (function_name_strval.v) {
                        if (ce->get_static_method) {
                                EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
                        } else {
@@ -4475,7 +4475,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEN
                }
        }
        if(IS_CV != IS_UNUSED) {
-               zstr function_name_strval;
+               zstr function_name_strval = NULL_ZSTR;
                unsigned int function_name_strlen = 0;
 
                zend_uchar function_name_type;
@@ -4496,7 +4496,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEN
                        }
                }
 
-               if (function_name_strlen) {
+               if (function_name_strval.v) {
                        if (ce->get_static_method) {
                                EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
                        } else {
@@ -10771,7 +10771,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZE
                }
        }
        if(IS_CONST != IS_UNUSED) {
-               zstr function_name_strval;
+               zstr function_name_strval = NULL_ZSTR;
                unsigned int function_name_strlen = 0;
 
                zend_uchar function_name_type;
@@ -10792,7 +10792,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZE
                        }
                }
 
-               if (function_name_strlen) {
+               if (function_name_strval.v) {
                        if (ce->get_static_method) {
                                EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
                        } else {
@@ -12686,7 +12686,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND
                }
        }
        if(IS_TMP_VAR != IS_UNUSED) {
-               zstr function_name_strval;
+               zstr function_name_strval = NULL_ZSTR;
                unsigned int function_name_strlen = 0;
                zend_free_op free_op2;
                zend_uchar function_name_type;
@@ -12707,7 +12707,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND
                        }
                }
 
-               if (function_name_strlen) {
+               if (function_name_strval.v) {
                        if (ce->get_static_method) {
                                EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
                        } else {
@@ -14581,7 +14581,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND
                }
        }
        if(IS_VAR != IS_UNUSED) {
-               zstr function_name_strval;
+               zstr function_name_strval = NULL_ZSTR;
                unsigned int function_name_strlen = 0;
                zend_free_op free_op2;
                zend_uchar function_name_type;
@@ -14602,7 +14602,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND
                        }
                }
 
-               if (function_name_strlen) {
+               if (function_name_strval.v) {
                        if (ce->get_static_method) {
                                EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
                        } else {
@@ -15564,7 +15564,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(Z
                }
        }
        if(IS_UNUSED != IS_UNUSED) {
-               zstr function_name_strval;
+               zstr function_name_strval = NULL_ZSTR;
                unsigned int function_name_strlen = 0;
 
                zend_uchar function_name_type;
@@ -15585,7 +15585,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(Z
                        }
                }
 
-               if (function_name_strlen) {
+               if (function_name_strval.v) {
                        if (ce->get_static_method) {
                                EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
                        } else {
@@ -17093,7 +17093,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_
                }
        }
        if(IS_CV != IS_UNUSED) {
-               zstr function_name_strval;
+               zstr function_name_strval = NULL_ZSTR;
                unsigned int function_name_strlen = 0;
 
                zend_uchar function_name_type;
@@ -17114,7 +17114,7 @@ static int ZEND_FASTCALL  ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_
                        }
                }
 
-               if (function_name_strlen) {
+               if (function_name_strval.v) {
                        if (ce->get_static_method) {
                                EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
                        } else {