cvs: ZendEngine2(PHP_5_2) / zend_vm_def.h zend_vm_execute.h /tests bug47704.phpt php-src NEWS
[email protected] ("Dmitry Stogov") Wed, 18 Mar 2009 13:11:34 -0000
| Newsgroups | php.zend-engine.cvs |
|---|---|
| Message-ID | <cvsdmitry1237381894@cvsserver> |
dmitry Wed Mar 18 13:11:34 2009 UTC
Added files: (Branch: PHP_5_2)
/ZendEngine2/tests bug47704.phpt
Modified files:
/php-src NEWS
/ZendEngine2 zend_vm_def.h zend_vm_execute.h
Log:
Fixed bug #47704 (PHP crashes on some "bad" operations with string offsets)
dmitry-20090318131134.txt
(text/plain, 16.7 KB)
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.1443&r2=1.2027.2.547.2.1444&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.1443 php-src/NEWS:1.2027.2.547.2.1444
--- php-src/NEWS:1.2027.2.547.2.1443 Wed Mar 18 08:15:27 2009
+++ php-src/NEWS Wed Mar 18 13:11:30 2009
@@ -6,6 +6,8 @@
- Fixed memory corruptions while reading properties of zip files. (Ilia)
+- Fixed bug #47704 (PHP crashes on some "bad" operations with string offsets).
+ (Dmitry)
- Fixed bug #47667 (ZipArchive::OVERWRITE seems to have no effect). (Mikko, Pierre)
- Fixed bug #47644 (Valid integers are truncated with json_decode()). (Scott)
- Fixed bug #47639 (pg_copy_from() WARNING: nonstandard use of \\ in a string
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.59.2.29.2.65&r2=1.59.2.29.2.66&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.59.2.29.2.65 ZendEngine2/zend_vm_def.h:1.59.2.29.2.66
--- ZendEngine2/zend_vm_def.h:1.59.2.29.2.65 Sun Feb 15 14:31:17 2009
+++ ZendEngine2/zend_vm_def.h Wed Mar 18 13:11:30 2009
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_vm_def.h,v 1.59.2.29.2.65 2009/02/15 14:31:17 iliaa Exp $ */
+/* $Id: zend_vm_def.h,v 1.59.2.29.2.66 2009/03/18 13:11:30 dmitry Exp $ */
/* If you change this file, please regenerate the zend_vm_execute.h and
* zend_vm_opcodes.h files by running:
@@ -294,6 +294,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (OP1_TYPE == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -545,6 +549,10 @@
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (OP1_TYPE == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -637,6 +645,10 @@
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (OP1_TYPE == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.62.2.30.2.68&r2=1.62.2.30.2.69&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.62.2.30.2.68 ZendEngine2/zend_vm_execute.h:1.62.2.30.2.69
--- ZendEngine2/zend_vm_execute.h:1.62.2.30.2.68 Sun Feb 15 14:31:17 2009
+++ ZendEngine2/zend_vm_execute.h Wed Mar 18 13:11:30 2009
@@ -8553,6 +8553,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -8803,6 +8807,10 @@
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -8895,6 +8903,10 @@
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -10070,6 +10082,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -10321,6 +10337,10 @@
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -10413,6 +10433,10 @@
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -11591,6 +11615,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -11842,6 +11870,10 @@
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -11934,6 +11966,10 @@
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -12926,6 +12962,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -13607,6 +13647,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -13857,6 +13901,10 @@
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -13949,6 +13997,10 @@
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -15017,6 +15069,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -15266,6 +15322,10 @@
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -15358,6 +15418,10 @@
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -16041,6 +16105,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -16291,6 +16359,10 @@
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -16383,6 +16455,10 @@
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -17022,6 +17098,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -17272,6 +17352,10 @@
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -17364,6 +17448,10 @@
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -18003,6 +18091,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -18269,6 +18361,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -18518,6 +18614,10 @@
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -18610,6 +18710,10 @@
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -20711,6 +20815,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -20960,6 +21068,10 @@
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -21052,6 +21164,10 @@
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -22220,6 +22336,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -22470,6 +22590,10 @@
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -22562,6 +22686,10 @@
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -23733,6 +23861,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -23983,6 +24115,10 @@
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -24075,6 +24211,10 @@
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -25059,6 +25199,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -25739,6 +25883,10 @@
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -25988,6 +26136,10 @@
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
@@ -26080,6 +26232,10 @@
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug47704.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/bug47704.phpt
+++ ZendEngine2/tests/bug47704.phpt
--TEST--
Bug #47704 (crashes on some "bad" operations with string offsets)
--FILE--
<?php
$s = "abd";
$s[0]->a += 1;
?>
--EXPECTF--
Fatal error: Cannot use string offset as an object in %sbug47704.php on line %d