dmitry Fri Aug 29 14:59:20 2008 UTC Added files: (Branch: PHP_5_3) /php-src/ext/standard/tests/serialize bug45706.phpt
Modified files: /php-src NEWS /php-src/ext/standard var_unserializer.c var_unserializer.re /php-src/ext/standard/tests/serialize serialization_objects_009.phpt Log: Fixed bug #45706 (Unserialization of classes derived from ArrayIterator fails)
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.965.2.294&r2=1.2027.2.547.2.965.2.295&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.547.2.965.2.294 php-src/NEWS:1.2027.2.547.2.965.2.295 --- php-src/NEWS:1.2027.2.547.2.965.2.294 Fri Aug 29 12:13:54 2008 +++ php-src/NEWS Fri Aug 29 14:59:19 2008 @@ -36,6 +36,8 @@ child class). (Felipe) - Fixed bug #45717 (Fileinfo/libmagic build fails, missing err.h and getopt.h). (Derick) +- Fixed bug #45706 (Unserialization of classes derived from ArrayIterator + fails). (Etienne, Dmitry) - Fixed bug #45696 (Not all DateTime methods allow method chaining). (Derick) - Fixed bug #45636 (fileinfo ext duplicate strndup). (Derick) - Fixed bug #45545 (DateInterval has 4 char limitation for ISO durations). http://cvs.php.net/viewvc.cgi/php-src/ext/standard/var_unserializer.c?r1=1.70.2.4.2.7.2.6&r2=1.70.2.4.2.7.2.7&diff_format=u Index: php-src/ext/standard/var_unserializer.c diff -u php-src/ext/standard/var_unserializer.c:1.70.2.4.2.7.2.6 php-src/ext/standard/var_unserializer.c:1.70.2.4.2.7.2.7 --- php-src/ext/standard/var_unserializer.c:1.70.2.4.2.7.2.6 Tue May 27 11:28:18 2008 +++ php-src/ext/standard/var_unserializer.c Fri Aug 29 14:59:20 2008 @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Tue May 27 06:20:00 2008 */ +/* Generated by re2c 0.13.5 on Fri Aug 29 18:39:52 2008 */ #line 1 "ext/standard/var_unserializer.re" /* +----------------------------------------------------------------------+ @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: var_unserializer.c,v 1.70.2.4.2.7.2.6 2008/05/27 11:28:18 mattwil Exp $ */ +/* $Id: var_unserializer.c,v 1.70.2.4.2.7.2.7 2008/08/29 14:59:20 dmitry Exp $ */ #include "php.h" #include "ext/standard/php_var.h" @@ -324,11 +324,6 @@ { long datalen; - if (ce->unserialize == NULL) { - zend_error(E_WARNING, "Class %s has no unserializer", ce->name); - return 0; - } - datalen = parse_iv2((*p) + 2, p); (*p) += 2; @@ -338,7 +333,10 @@ return 0; } - if (ce->unserialize(rval, ce, (const unsigned char*)*p, datalen, (zend_unserialize_data *)var_hash TSRMLS_CC) != SUCCESS) { + if (ce->unserialize == NULL) { + zend_error(E_WARNING, "Class %s has no unserializer", ce->name); + object_init_ex(*rval, ce); + } else if (ce->unserialize(rval, ce, (const unsigned char*)*p, datalen, (zend_unserialize_data *)var_hash TSRMLS_CC) != SUCCESS) { return 0; } @@ -398,7 +396,7 @@ -#line 402 "ext/standard/var_unserializer.c" +#line 400 "ext/standard/var_unserializer.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -458,9 +456,9 @@ yych = *(YYMARKER = ++YYCURSOR); if (yych == ':') goto yy95; yy3: -#line 696 "ext/standard/var_unserializer.re" +#line 699 "ext/standard/var_unserializer.re" { return 0; } -#line 464 "ext/standard/var_unserializer.c" +#line 462 "ext/standard/var_unserializer.c" yy4: yych = *(YYMARKER = ++YYCURSOR); if (yych == ':') goto yy89; @@ -503,13 +501,13 @@ goto yy3; yy14: ++YYCURSOR; -#line 690 "ext/standard/var_unserializer.re" +#line 693 "ext/standard/var_unserializer.re" { /* this is the case where we have less data than planned */ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unexpected end of serialized data"); return 0; /* not sure if it should be 0 or 1 here? */ } -#line 513 "ext/standard/var_unserializer.c" +#line 511 "ext/standard/var_unserializer.c" yy16: yych = *++YYCURSOR; goto yy3; @@ -539,7 +537,7 @@ yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 578 "ext/standard/var_unserializer.re" +#line 576 "ext/standard/var_unserializer.re" { size_t len, len2, len3, maxlen; long elements; @@ -638,8 +636,13 @@ *p = YYCURSOR; if (custom_object) { + int ret = object_custom(UNSERIALIZE_PASSTHRU, ce); + + if (ret && incomplete_class) { + php_store_class_name(*rval, class_name, len2); + } efree(class_name); - return object_custom(UNSERIALIZE_PASSTHRU, ce); + return ret; } elements = object_common1(UNSERIALIZE_PASSTHRU, ce); @@ -651,7 +654,7 @@ return object_common2(UNSERIALIZE_PASSTHRU, elements); } -#line 655 "ext/standard/var_unserializer.c" +#line 658 "ext/standard/var_unserializer.c" yy25: yych = *++YYCURSOR; if (yych <= ',') { @@ -676,7 +679,7 @@ yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 570 "ext/standard/var_unserializer.re" +#line 568 "ext/standard/var_unserializer.re" { INIT_PZVAL(*rval); @@ -684,7 +687,7 @@ return object_common2(UNSERIALIZE_PASSTHRU, object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR)); } -#line 688 "ext/standard/var_unserializer.c" +#line 691 "ext/standard/var_unserializer.c" yy32: yych = *++YYCURSOR; if (yych == '+') goto yy33; @@ -705,7 +708,7 @@ yych = *++YYCURSOR; if (yych != '{') goto yy18; ++YYCURSOR; -#line 550 "ext/standard/var_unserializer.re" +#line 548 "ext/standard/var_unserializer.re" { long elements = parse_iv(start + 2); /* use iv() not uiv() in order to check data range */ @@ -725,7 +728,7 @@ return finish_nested_data(UNSERIALIZE_PASSTHRU); } -#line 729 "ext/standard/var_unserializer.c" +#line 732 "ext/standard/var_unserializer.c" yy39: yych = *++YYCURSOR; if (yych == '+') goto yy40; @@ -746,7 +749,7 @@ yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 521 "ext/standard/var_unserializer.re" +#line 519 "ext/standard/var_unserializer.re" { size_t len, maxlen; char *str; @@ -775,7 +778,7 @@ ZVAL_STRINGL(*rval, str, len, 0); return 1; } -#line 779 "ext/standard/var_unserializer.c" +#line 782 "ext/standard/var_unserializer.c" yy46: yych = *++YYCURSOR; if (yych == '+') goto yy47; @@ -796,7 +799,7 @@ yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 493 "ext/standard/var_unserializer.re" +#line 491 "ext/standard/var_unserializer.re" { size_t len, maxlen; char *str; @@ -824,7 +827,7 @@ ZVAL_STRINGL(*rval, str, len, 1); return 1; } -#line 828 "ext/standard/var_unserializer.c" +#line 831 "ext/standard/var_unserializer.c" yy53: yych = *++YYCURSOR; if (yych <= '/') { @@ -912,14 +915,14 @@ } yy63: ++YYCURSOR; -#line 486 "ext/standard/var_unserializer.re" +#line 484 "ext/standard/var_unserializer.re" { *p = YYCURSOR; INIT_PZVAL(*rval); ZVAL_DOUBLE(*rval, zend_strtod((const char *)start + 2, NULL)); return 1; } -#line 923 "ext/standard/var_unserializer.c" +#line 926 "ext/standard/var_unserializer.c" yy65: yych = *++YYCURSOR; if (yych <= ',') { @@ -978,7 +981,7 @@ yych = *++YYCURSOR; if (yych != ';') goto yy18; ++YYCURSOR; -#line 471 "ext/standard/var_unserializer.re" +#line 469 "ext/standard/var_unserializer.re" { *p = YYCURSOR; INIT_PZVAL(*rval); @@ -993,7 +996,7 @@ return 1; } -#line 997 "ext/standard/var_unserializer.c" +#line 1000 "ext/standard/var_unserializer.c" yy76: yych = *++YYCURSOR; if (yych == 'N') goto yy73; @@ -1020,14 +1023,14 @@ if (yych <= '9') goto yy79; if (yych != ';') goto yy18; ++YYCURSOR; -#line 464 "ext/standard/var_unserializer.re" +#line 462 "ext/standard/var_unserializer.re" { *p = YYCURSOR; INIT_PZVAL(*rval); ZVAL_LONG(*rval, parse_iv(start + 2)); return 1; } -#line 1031 "ext/standard/var_unserializer.c" +#line 1034 "ext/standard/var_unserializer.c" yy83: yych = *++YYCURSOR; if (yych <= '/') goto yy18; @@ -1035,24 +1038,24 @@ yych = *++YYCURSOR; if (yych != ';') goto yy18; ++YYCURSOR; -#line 457 "ext/standard/var_unserializer.re" +#line 455 "ext/standard/var_unserializer.re" { *p = YYCURSOR; INIT_PZVAL(*rval); ZVAL_BOOL(*rval, parse_iv(start + 2)); return 1; } -#line 1046 "ext/standard/var_unserializer.c" +#line 1049 "ext/standard/var_unserializer.c" yy87: ++YYCURSOR; -#line 450 "ext/standard/var_unserializer.re" +#line 448 "ext/standard/var_unserializer.re" { *p = YYCURSOR; INIT_PZVAL(*rval); ZVAL_NULL(*rval); return 1; } -#line 1056 "ext/standard/var_unserializer.c" +#line 1059 "ext/standard/var_unserializer.c" yy89: yych = *++YYCURSOR; if (yych <= ',') { @@ -1075,7 +1078,7 @@ if (yych <= '9') goto yy91; if (yych != ';') goto yy18; ++YYCURSOR; -#line 427 "ext/standard/var_unserializer.re" +#line 425 "ext/standard/var_unserializer.re" { long id; @@ -1098,7 +1101,7 @@ return 1; } -#line 1102 "ext/standard/var_unserializer.c" +#line 1105 "ext/standard/var_unserializer.c" yy95: yych = *++YYCURSOR; if (yych <= ',') { @@ -1121,7 +1124,7 @@ if (yych <= '9') goto yy97; if (yych != ';') goto yy18; ++YYCURSOR; -#line 406 "ext/standard/var_unserializer.re" +#line 404 "ext/standard/var_unserializer.re" { long id; @@ -1142,9 +1145,9 @@ return 1; } -#line 1146 "ext/standard/var_unserializer.c" +#line 1149 "ext/standard/var_unserializer.c" } -#line 698 "ext/standard/var_unserializer.re" +#line 701 "ext/standard/var_unserializer.re" return 0; http://cvs.php.net/viewvc.cgi/php-src/ext/standard/var_unserializer.re?r1=1.52.2.2.2.6.2.5&r2=1.52.2.2.2.6.2.6&diff_format=u Index: php-src/ext/standard/var_unserializer.re diff -u php-src/ext/standard/var_unserializer.re:1.52.2.2.2.6.2.5 php-src/ext/standard/var_unserializer.re:1.52.2.2.2.6.2.6 --- php-src/ext/standard/var_unserializer.re:1.52.2.2.2.6.2.5 Tue May 27 10:29:33 2008 +++ php-src/ext/standard/var_unserializer.re Fri Aug 29 14:59:20 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: var_unserializer.re,v 1.52.2.2.2.6.2.5 2008/05/27 10:29:33 mattwil Exp $ */ +/* $Id: var_unserializer.re,v 1.52.2.2.2.6.2.6 2008/08/29 14:59:20 dmitry Exp $ */ #include "php.h" #include "ext/standard/php_var.h" @@ -328,11 +328,6 @@ { long datalen; - if (ce->unserialize == NULL) { - zend_error(E_WARNING, "Class %s has no unserializer", ce->name); - return 0; - } - datalen = parse_iv2((*p) + 2, p); (*p) += 2; @@ -342,7 +337,10 @@ return 0; } - if (ce->unserialize(rval, ce, (const unsigned char*)*p, datalen, (zend_unserialize_data *)var_hash TSRMLS_CC) != SUCCESS) { + if (ce->unserialize == NULL) { + zend_error(E_WARNING, "Class %s has no unserializer", ce->name); + object_init_ex(*rval, ce); + } else if (ce->unserialize(rval, ce, (const unsigned char*)*p, datalen, (zend_unserialize_data *)var_hash TSRMLS_CC) != SUCCESS) { return 0; } @@ -673,8 +671,13 @@ *p = YYCURSOR; if (custom_object) { + int ret = object_custom(UNSERIALIZE_PASSTHRU, ce); + + if (ret && incomplete_class) { + php_store_class_name(*rval, class_name, len2); + } efree(class_name); - return object_custom(UNSERIALIZE_PASSTHRU, ce); + return ret; } elements = object_common1(UNSERIALIZE_PASSTHRU, ce); http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/serialize/serialization_objects_009.phpt?r1=1.1.4.2&r2=1.1.4.3&diff_format=u Index: php-src/ext/standard/tests/serialize/serialization_objects_009.phpt diff -u php-src/ext/standard/tests/serialize/serialization_objects_009.phpt:1.1.4.2 php-src/ext/standard/tests/serialize/serialization_objects_009.phpt:1.1.4.3 --- php-src/ext/standard/tests/serialize/serialization_objects_009.phpt:1.1.4.2 Tue Mar 18 15:11:48 2008 +++ php-src/ext/standard/tests/serialize/serialization_objects_009.phpt Fri Aug 29 14:59:20 2008 @@ -23,14 +23,13 @@ echo "Done"; ?> --EXPECTF-- +Warning: Class __PHP_Incomplete_Class has no unserializer in %sserialization_objects_009.php on line %d -Warning: Class __PHP_Incomplete_Class has no unserializer in %s on line 14 - -Notice: unserialize(): Error at offset 6 of 18 bytes in %s on line 14 - -Warning: Class C has no unserializer in %s on line 16 - -Notice: unserialize(): Error at offset 6 of 18 bytes in %s on line 16 -bool(false) -bool(false) +Warning: Class C has no unserializer in %sserialization_objects_009.php on line %d +object(__PHP_Incomplete_Class)#%d (1) { + ["__PHP_Incomplete_Class_Name"]=> + string(1) "C" +} +object(C)#%d (0) { +} Done \ No newline at end of file http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/serialize/bug45706.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/serialize/bug45706.phpt +++ php-src/ext/standard/tests/serialize/bug45706.phpt
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php