]> granicus.if.org Git - php/commitdiff
Fixed bug #54262 (Crash when assigning value to a dimension in a non-array)
authorDmitry Stogov <dmitry@php.net>
Wed, 16 Mar 2011 11:14:33 +0000 (11:14 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 16 Mar 2011 11:14:33 +0000 (11:14 +0000)
Zend/tests/bug54262.phpt [new file with mode: 0644]
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/Zend/tests/bug54262.phpt b/Zend/tests/bug54262.phpt
new file mode 100644 (file)
index 0000000..24c7122
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Bug #54262 (Crash when assigning value to a dimension in a non-array)
+--FILE--
+<?php
+$a = '0';
+var_dump(isset($a['b']));
+$simpleString = preg_match('//', '', $a->a);
+$simpleString["wrong"] = "f";
+echo "ok\n";
+?>
+--EXPECTF--
+bool(true)
+
+Warning: Attempt to modify property of non-object in %s/Zend/tests/bug54262.php on line 4
+
+Warning: Cannot use a scalar value as an array in %s/Zend/tests/bug54262.php on line 5
+ok
\ No newline at end of file
index 79cff3e9ef493f549f76be936298665355fbe670..8de53845a5beb418f2511ec309038669435669ba 100644 (file)
@@ -3051,10 +3051,10 @@ ZEND_VM_HANDLER(67, ZEND_SEND_REF, VAR|CV, ANY)
        }
 
        if (OP1_TYPE == IS_VAR && UNEXPECTED(*varptr_ptr == &EG(error_zval))) {
-               Z_DELREF_PP(varptr_ptr);
-               ALLOC_ZVAL(*varptr_ptr);
-               INIT_ZVAL(**varptr_ptr);
-               Z_SET_REFCOUNT_PP(varptr_ptr, 0);
+               ALLOC_INIT_ZVAL(varptr);
+               zend_vm_stack_push(varptr TSRMLS_CC);
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
        }
 
        if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION && !ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.opline_num)) {
index ad210ab7d919602c7ed707815c9f832239f4af6b..ea83b6f4415427919ae188053a14e96d315bd058 100644 (file)
@@ -10621,10 +10621,10 @@ static int ZEND_FASTCALL  ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
        }
 
        if (IS_VAR == IS_VAR && UNEXPECTED(*varptr_ptr == &EG(error_zval))) {
-               Z_DELREF_PP(varptr_ptr);
-               ALLOC_ZVAL(*varptr_ptr);
-               INIT_ZVAL(**varptr_ptr);
-               Z_SET_REFCOUNT_PP(varptr_ptr, 0);
+               ALLOC_INIT_ZVAL(varptr);
+               zend_vm_stack_push(varptr TSRMLS_CC);
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
        }
 
        if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION && !ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.opline_num)) {
@@ -26310,10 +26310,10 @@ static int ZEND_FASTCALL  ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        }
 
        if (IS_CV == IS_VAR && UNEXPECTED(*varptr_ptr == &EG(error_zval))) {
-               Z_DELREF_PP(varptr_ptr);
-               ALLOC_ZVAL(*varptr_ptr);
-               INIT_ZVAL(**varptr_ptr);
-               Z_SET_REFCOUNT_PP(varptr_ptr, 0);
+               ALLOC_INIT_ZVAL(varptr);
+               zend_vm_stack_push(varptr TSRMLS_CC);
+               CHECK_EXCEPTION();
+               ZEND_VM_NEXT_OPCODE();
        }
 
        if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION && !ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.opline_num)) {