diff options
author | Dmitry Stogov <dmitry@php.net> | 2008-08-29 14:59:20 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2008-08-29 14:59:20 +0000 |
commit | 78d28494ca13ea4bb71933ebcb47d7565c91d214 (patch) | |
tree | 2ddd4d428d3af7b149c0d6f3ea0734db7f869d2e /ext/standard/var_unserializer.c | |
parent | 740ba5ac0a0324911c5ddf0fe8f0c46f32b24a30 (diff) | |
download | php-git-78d28494ca13ea4bb71933ebcb47d7565c91d214.tar.gz |
Fixed bug #45706 (Unserialization of classes derived from ArrayIterator fails)
Diffstat (limited to 'ext/standard/var_unserializer.c')
-rw-r--r-- | ext/standard/var_unserializer.c | 79 |
1 files changed, 41 insertions, 38 deletions
diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c index 00a971540d..7dc84b0bc2 100644 --- a/ext/standard/var_unserializer.c +++ b/ext/standard/var_unserializer.c @@ -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" /* +----------------------------------------------------------------------+ @@ -324,11 +324,6 @@ static inline int object_custom(UNSERIALIZE_PARAMETER, zend_class_entry *ce) { 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 @@ static inline int object_custom(UNSERIALIZE_PARAMETER, zend_class_entry *ce) 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 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER) -#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 @@ yy2: 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 @@ yy13: 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 @@ yy20: 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 @@ yy20: *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 @@ yy20: 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 @@ yy27: 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 @@ yy27: 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 @@ yy34: 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 @@ yy34: 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 @@ yy41: 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 @@ yy41: 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 @@ yy48: 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 @@ yy48: 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 @@ yy61: } 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 @@ yy73: 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 @@ yy73: 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 @@ yy79: 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 @@ yy83: 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 @@ yy91: 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 @@ yy91: 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 @@ yy97: 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 @@ yy97: 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; |