dmitry Mon Mar 27 13:37:47 2006 UTC Modified files: /php-src/ext/standard incomplete_class.c php_incomplete_class.h var.c var_unserializer.c var_unserializer.re /php-src/ext/standard/tests/serialize 001.phpt 005.phpt 006.phpt bug14293.phpt bug21957.phpt bug26762.phpt bug27469.phpt bug28325.phpt bug31402.phpt Log: Unicode support
http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/incomplete_class.c?r1=1.32&r2=1.33&diff_format=u Index: php-src/ext/standard/incomplete_class.c diff -u php-src/ext/standard/incomplete_class.c:1.32 php-src/ext/standard/incomplete_class.c:1.33 --- php-src/ext/standard/incomplete_class.c:1.32 Sun Feb 26 11:57:14 2006 +++ php-src/ext/standard/incomplete_class.c Mon Mar 27 13:37:46 2006 @@ -17,7 +17,7 @@ */ -/* $Id: incomplete_class.c,v 1.32 2006/02/26 11:57:14 dmitry Exp $ */ +/* $Id: incomplete_class.c,v 1.33 2006/03/27 13:37:46 dmitry Exp $ */ #include "php.h" #include "basic_functions.h" @@ -98,7 +98,7 @@ value.handlers = &php_incomplete_object_handlers; ALLOC_HASHTABLE(object->properties); - zend_hash_init(object->properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_u_hash_init(object->properties, 0, NULL, ZVAL_PTR_DTOR, 0, UG(unicode)); return value; } @@ -133,10 +133,14 @@ object_properties = Z_OBJPROP_P(object); if (zend_hash_find(object_properties, MAGIC_MEMBER, sizeof(MAGIC_MEMBER), (void **) &val) == SUCCESS) { - retval.s = estrndup(Z_STRVAL_PP(val), Z_STRLEN_PP(val)); + if (UG(unicode)) { + retval.u = eustrndup(Z_USTRVAL_PP(val), Z_USTRLEN_PP(val)); + } else { + retval.s = estrndup(Z_STRVAL_PP(val), Z_STRLEN_PP(val)); + } if (nlen) - *nlen = Z_STRLEN_PP(val); + *nlen = Z_UNILEN_PP(val); } return retval; @@ -145,16 +149,13 @@ /* {{{ php_store_class_name */ -PHPAPI void php_store_class_name(zval *object, const char *name, zend_uint len) +PHPAPI void php_store_class_name(zval *object, zstr name, zend_uint len) { zval *val; TSRMLS_FETCH(); MAKE_STD_ZVAL(val); - - Z_TYPE_P(val) = IS_STRING; - Z_STRVAL_P(val) = estrndup(name, len); - Z_STRLEN_P(val) = len; + ZVAL_TEXTL(val, name, len, 1); zend_hash_update(Z_OBJPROP_P(object), MAGIC_MEMBER, sizeof(MAGIC_MEMBER), &val, sizeof(val), NULL); } http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/php_incomplete_class.h?r1=1.20&r2=1.21&diff_format=u Index: php-src/ext/standard/php_incomplete_class.h diff -u php-src/ext/standard/php_incomplete_class.h:1.20 php-src/ext/standard/php_incomplete_class.h:1.21 --- php-src/ext/standard/php_incomplete_class.h:1.20 Tue Feb 21 20:12:42 2006 +++ php-src/ext/standard/php_incomplete_class.h Mon Mar 27 13:37:46 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_incomplete_class.h,v 1.20 2006/02/21 20:12:42 dmitry Exp $ */ +/* $Id: php_incomplete_class.h,v 1.21 2006/03/27 13:37:46 dmitry Exp $ */ #ifndef PHP_INCOMPLETE_CLASS_H #define PHP_INCOMPLETE_CLASS_H @@ -56,7 +56,7 @@ zend_class_entry *php_create_incomplete_class(TSRMLS_D); PHPAPI zstr php_lookup_class_name(zval *object, zend_uint *nlen); -PHPAPI void php_store_class_name(zval *object, const char *name, zend_uint len); +PHPAPI void php_store_class_name(zval *object, zstr name, zend_uint len); #ifdef __cplusplus }; http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/var.c?r1=1.225&r2=1.226&diff_format=u Index: php-src/ext/standard/var.c diff -u php-src/ext/standard/var.c:1.225 php-src/ext/standard/var.c:1.226 --- php-src/ext/standard/var.c:1.225 Wed Mar 15 09:50:47 2006 +++ php-src/ext/standard/var.c Mon Mar 27 13:37:46 2006 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: var.c,v 1.225 2006/03/15 09:50:47 derick Exp $ */ +/* $Id: var.c,v 1.226 2006/03/27 13:37:46 dmitry Exp $ */ @@ -681,10 +681,10 @@ for(i=0; i<len; /* U16_NEXT post-increments */) { U16_NEXT(ustr, i, len, c); - if (c < 128) { + if (c < 128 && c != '\\') { smart_str_appendc(buf, c & 0xff); } else { - smart_str_appendl(buf, "\\u", 2); + smart_str_appendc(buf, '\\'); smart_str_appendc(buf, hex[(c >> 12) & 0xf]); smart_str_appendc(buf, hex[(c >> 8) & 0xf]); smart_str_appendc(buf, hex[(c >> 4) & 0xf]); @@ -1070,7 +1070,10 @@ PHP_VAR_SERIALIZE_DESTROY(var_hash); if (buf.c) { - RETURN_STRINGL(buf.c, buf.len, 0); + RETVAL_ASCII_STRINGL(buf.c, buf.len, 0); + if (UG(unicode)) { + smart_str_free(&buf); + } } else { RETURN_NULL(); } @@ -1090,6 +1093,23 @@ WRONG_PARAM_COUNT; } + if (Z_TYPE_PP(buf) == IS_UNICODE) { + /* ASCII unicode string to binary string conversion */ + char *str = emalloc(Z_USTRLEN_PP(buf)+1); + int i; + + for (i = 0; i < Z_UNILEN_PP(buf); i++) { + if (Z_USTRVAL_PP(buf)[i] > 128) { + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Error at offset %d of %d bytes", i, Z_USTRLEN_PP(buf)); + } + str[i] = Z_USTRVAL_PP(buf)[i]; + } + str[i] = '\0'; + efree(Z_USTRVAL_PP(buf)); + Z_STRVAL_PP(buf) = str; + Z_TYPE_PP(buf) = IS_STRING; + } + if (Z_TYPE_PP(buf) == IS_STRING) { const unsigned char *p = (unsigned char*)Z_STRVAL_PP(buf); http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/var_unserializer.c?r1=1.78&r2=1.79&diff_format=u Index: php-src/ext/standard/var_unserializer.c diff -u php-src/ext/standard/var_unserializer.c:1.78 php-src/ext/standard/var_unserializer.c:1.79 --- php-src/ext/standard/var_unserializer.c:1.78 Thu Mar 2 13:12:45 2006 +++ php-src/ext/standard/var_unserializer.c Mon Mar 27 13:37:46 2006 @@ -1,4 +1,4 @@ -/* Generated by re2c 0.9.11 on Sun Feb 19 13:10:33 2006 */ +/* Generated by re2c 0.9.10 on Mon Mar 27 17:29:16 2006 */ #line 1 "ext/standard/var_unserializer.re" /* +----------------------------------------------------------------------+ @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: var_unserializer.c,v 1.78 2006/03/02 13:12:45 dmitry Exp $ */ +/* $Id: var_unserializer.c,v 1.79 2006/03/27 13:37:46 dmitry Exp $ */ #include "php.h" #include "ext/standard/php_var.h" @@ -80,6 +80,38 @@ var_hash->data[var_hash->used_slots++] = *rval; } +static UChar *unserialize_ustr(const unsigned char **p, int len) +{ + int i, j; + UChar *ustr = eumalloc(len+1); + + for (i = 0; i < len; i++) { + if (**p != '\\') { + ustr[i] = (UChar)**p; + } else { + UChar ch = 0; + + for (j = 0; j < 4; j++) { + (*p)++; + if (**p >= '0' && **p <= '9') { + ch = (ch << 4) + (**p -'0'); + } else if (**p >= 'a' && **p <= 'f') { + ch = (ch << 4) + (**p -'a'+10); + } else if (**p >= 'A' && **p <= 'F') { + ch = (ch << 4) + (**p -'A'+10); + } else { + efree(ustr); + return NULL; + } + } + ustr[i] = ch; + } + (*p)++; + } + ustr[i] = 0; + return ustr; +} + PHPAPI void var_replace(php_unserialize_data_t *var_hashx, zval *ozval, zval **nzval) { long i; @@ -147,7 +179,7 @@ #define YYMARKER marker -#line 155 "ext/standard/var_unserializer.re" +#line 187 "ext/standard/var_unserializer.re" @@ -223,7 +255,9 @@ return 0; } - if (Z_TYPE_P(key) != IS_LONG && Z_TYPE_P(key) != IS_STRING) { + if (Z_TYPE_P(key) != IS_LONG && + Z_TYPE_P(key) != IS_STRING && + Z_TYPE_P(key) != IS_UNICODE) { zval_dtor(key); FREE_ZVAL(key); return 0; @@ -247,10 +281,11 @@ zend_hash_index_update(ht, Z_LVAL_P(key), &data, sizeof(data), NULL); break; case IS_STRING: - if (zend_hash_find(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, (void **)&old_data)==SUCCESS) { + case IS_UNICODE: + if (zend_u_hash_find(ht, Z_TYPE_P(key), Z_UNIVAL_P(key), Z_UNILEN_P(key) + 1, (void **)&old_data)==SUCCESS) { var_push_dtor(var_hash, old_data); } - zend_hash_update(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &data, sizeof(data), NULL); + zend_u_hash_update(ht, Z_TYPE_P(key), Z_UNIVAL_P(key), Z_UNILEN_P(key) + 1, &data, sizeof(data), NULL); break; } @@ -391,119 +426,124 @@ 0, 0, 0, 0, 0, 0, 0, 0, }; -#line 395 "ext/standard/var_unserializer.c" +#line 430 "ext/standard/var_unserializer.c" { YYCTYPE yych; - unsigned int yyaccept = 0; + unsigned int yyaccept; goto yy0; ++YYCURSOR; yy0: if((YYLIMIT - YYCURSOR) < 7) YYFILL(7); yych = *YYCURSOR; switch(yych){ - case 'C': case 'O': goto yy12; + case 'C': case 'O': goto yy13; case 'N': goto yy5; case 'R': goto yy2; - case 'a': goto yy10; + case 'U': goto yy10; + case 'a': goto yy11; case 'b': goto yy6; case 'd': goto yy8; case 'i': goto yy7; - case 'o': goto yy11; + case 'o': goto yy12; case 'r': goto yy4; case 's': goto yy9; - case '}': goto yy13; - default: goto yy15; + case '}': goto yy14; + default: goto yy16; } yy2: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == ':') goto yy87; + if(yych == ':') goto yy95; goto yy3; yy3: -#line 627 "ext/standard/var_unserializer.re" +#line 693 "ext/standard/var_unserializer.re" { return 0; } -#line 425 "ext/standard/var_unserializer.c" +#line 461 "ext/standard/var_unserializer.c" yy4: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == ':') goto yy81; + if(yych == ':') goto yy89; goto yy3; yy5: yych = *++YYCURSOR; - if(yych == ';') goto yy79; + if(yych == ';') goto yy87; goto yy3; yy6: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == ':') goto yy75; + if(yych == ':') goto yy83; goto yy3; yy7: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == ':') goto yy69; + if(yych == ':') goto yy77; goto yy3; yy8: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == ':') goto yy45; + if(yych == ':') goto yy53; goto yy3; yy9: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == ':') goto yy38; + if(yych == ':') goto yy46; goto yy3; yy10: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == ':') goto yy31; + if(yych == ':') goto yy39; goto yy3; yy11: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == ':') goto yy24; + if(yych == ':') goto yy32; goto yy3; yy12: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == ':') goto yy16; + if(yych == ':') goto yy25; goto yy3; -yy13: ++YYCURSOR; - goto yy14; -yy14: -#line 621 "ext/standard/var_unserializer.re" +yy13: yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if(yych == ':') goto yy17; + goto yy3; +yy14: ++YYCURSOR; + goto yy15; +yy15: +#line 687 "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 470 "ext/standard/var_unserializer.c" -yy15: yych = *++YYCURSOR; - goto yy3; +#line 510 "ext/standard/var_unserializer.c" yy16: yych = *++YYCURSOR; + goto yy3; +yy17: yych = *++YYCURSOR; if(yybm[0+yych] & 128) { - goto yy19; + goto yy20; } - if(yych == '+') goto yy18; - goto yy17; -yy17: YYCURSOR = YYMARKER; + if(yych == '+') goto yy19; + goto yy18; +yy18: YYCURSOR = YYMARKER; switch(yyaccept){ case 0: goto yy3; } -yy18: yych = *++YYCURSOR; +yy19: yych = *++YYCURSOR; if(yybm[0+yych] & 128) { - goto yy19; + goto yy20; } - goto yy17; -yy19: ++YYCURSOR; + goto yy18; +yy20: ++YYCURSOR; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - goto yy20; -yy20: if(yybm[0+yych] & 128) { - goto yy19; - } - if(yych != ':') goto yy17; goto yy21; -yy21: yych = *++YYCURSOR; - if(yych != '"') goto yy17; +yy21: if(yybm[0+yych] & 128) { + goto yy20; + } + if(yych != ':') goto yy18; goto yy22; -yy22: ++YYCURSOR; +yy22: yych = *++YYCURSOR; + if(yych != '"') goto yy18; goto yy23; -yy23: -#line 509 "ext/standard/var_unserializer.re" +yy23: ++YYCURSOR; + goto yy24; +yy24: +#line 574 "ext/standard/var_unserializer.re" { size_t len, len2, len3, maxlen; long elements; - char *class_name; + zstr class_name; zend_class_entry *ce; zend_class_entry **pce; int incomplete_class = 0; @@ -527,31 +567,32 @@ return 0; } - class_name = (char*)YYCURSOR; - - YYCURSOR += len; + if (UG(unicode)) { + class_name.u = unserialize_ustr(&YYCURSOR, len); + } else { + len3 = strspn((char*)YYCURSOR, "0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377"); + if (len3 != len) { + *p = YYCURSOR + len3 - len; + return 0; + } + class_name.s = estrndup((char*)YYCURSOR, len); + YYCURSOR += len; + } if (*(YYCURSOR) != '"') { + efree(class_name.v); *p = YYCURSOR; return 0; } if (*(YYCURSOR+1) != ':') { + efree(class_name.v); *p = YYCURSOR+1; return 0; } - len3 = strspn(class_name, "0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377"); - if (len3 != len) - { - *p = YYCURSOR + len3 - len; - return 0; - } - - class_name = estrndup(class_name, len); - do { /* Try to find class directly */ - if (zend_lookup_class(class_name, len2, &pce TSRMLS_CC) == SUCCESS) { + if (zend_u_lookup_class(UG(unicode)?IS_UNICODE:IS_STRING, class_name, len2, &pce TSRMLS_CC) == SUCCESS) { ce = *pce; break; } @@ -568,7 +609,7 @@ ZVAL_STRING(user_func, PG(unserialize_callback_func), 1); args[0] = &arg_func_name; MAKE_STD_ZVAL(arg_func_name); - ZVAL_STRING(arg_func_name, class_name, 1); + ZVAL_TEXT(arg_func_name, class_name, 1); if (call_user_function_ex(CG(function_table), NULL, user_func, &retval_ptr, 1, args, 0, NULL TSRMLS_CC) != SUCCESS) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "defined (%s) but not found", user_func->value.str.val); incomplete_class = 1; @@ -582,7 +623,7 @@ } /* The callback function may have defined the class */ - if (zend_lookup_class(class_name, len2, &pce TSRMLS_CC) == SUCCESS) { + if (zend_u_lookup_class(UG(unicode)?IS_UNICODE:IS_STRING, class_name, len2, &pce TSRMLS_CC) == SUCCESS) { ce = *pce; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Function %s() hasn't defined the class it was called for", user_func->value.str.val); @@ -598,7 +639,7 @@ *p = YYCURSOR; if(custom_object) { - efree(class_name); + efree(class_name.v); return object_custom(UNSERIALIZE_PASSTHRU, ce); } @@ -607,40 +648,40 @@ if (incomplete_class) { php_store_class_name(*rval, class_name, len2); } - efree(class_name); + efree(class_name.v); return object_common2(UNSERIALIZE_PASSTHRU, elements); } -#line 615 "ext/standard/var_unserializer.c" -yy24: yych = *++YYCURSOR; +#line 656 "ext/standard/var_unserializer.c" +yy25: yych = *++YYCURSOR; if(yych <= ','){ - if(yych != '+') goto yy17; - goto yy25; + if(yych != '+') goto yy18; + goto yy26; } else { - if(yych <= '-') goto yy25; - if(yych <= '/') goto yy17; - if(yych <= '9') goto yy26; - goto yy17; - } -yy25: yych = *++YYCURSOR; - if(yych <= '/') goto yy17; - if(yych >= ':') goto yy17; - goto yy26; -yy26: ++YYCURSOR; + if(yych <= '-') goto yy26; + if(yych <= '/') goto yy18; + if(yych <= '9') goto yy27; + goto yy18; + } +yy26: yych = *++YYCURSOR; + if(yych <= '/') goto yy18; + if(yych >= ':') goto yy18; + goto yy27; +yy27: ++YYCURSOR; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - goto yy27; -yy27: if(yych <= '/') goto yy17; - if(yych <= '9') goto yy26; - if(yych >= ';') goto yy17; goto yy28; -yy28: yych = *++YYCURSOR; - if(yych != '"') goto yy17; +yy28: if(yych <= '/') goto yy18; + if(yych <= '9') goto yy27; + if(yych >= ';') goto yy18; goto yy29; -yy29: ++YYCURSOR; +yy29: yych = *++YYCURSOR; + if(yych != '"') goto yy18; goto yy30; -yy30: -#line 501 "ext/standard/var_unserializer.re" +yy30: ++YYCURSOR; + goto yy31; +yy31: +#line 566 "ext/standard/var_unserializer.re" { INIT_PZVAL(*rval); @@ -648,31 +689,31 @@ return object_common2(UNSERIALIZE_PASSTHRU, object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR)); } -#line 652 "ext/standard/var_unserializer.c" -yy31: yych = *++YYCURSOR; - if(yych == '+') goto yy32; - if(yych <= '/') goto yy17; - if(yych <= '9') goto yy33; - goto yy17; +#line 693 "ext/standard/var_unserializer.c" yy32: yych = *++YYCURSOR; - if(yych <= '/') goto yy17; - if(yych >= ':') goto yy17; - goto yy33; -yy33: ++YYCURSOR; + if(yych == '+') goto yy33; + if(yych <= '/') goto yy18; + if(yych <= '9') goto yy34; + goto yy18; +yy33: yych = *++YYCURSOR; + if(yych <= '/') goto yy18; + if(yych >= ':') goto yy18; + goto yy34; +yy34: ++YYCURSOR; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - goto yy34; -yy34: if(yych <= '/') goto yy17; - if(yych <= '9') goto yy33; - if(yych >= ';') goto yy17; goto yy35; -yy35: yych = *++YYCURSOR; - if(yych != '{') goto yy17; +yy35: if(yych <= '/') goto yy18; + if(yych <= '9') goto yy34; + if(yych >= ';') goto yy18; goto yy36; -yy36: ++YYCURSOR; +yy36: yych = *++YYCURSOR; + if(yych != '{') goto yy18; goto yy37; -yy37: -#line 479 "ext/standard/var_unserializer.re" +yy37: ++YYCURSOR; + goto yy38; +yy38: +#line 544 "ext/standard/var_unserializer.re" { long elements = parse_iv(start + 2); /* use iv() not uiv() in order to check data range */ @@ -694,31 +735,85 @@ return finish_nested_data(UNSERIALIZE_PASSTHRU); } -#line 698 "ext/standard/var_unserializer.c" -yy38: yych = *++YYCURSOR; - if(yych == '+') goto yy39; - if(yych <= '/') goto yy17; - if(yych <= '9') goto yy40; - goto yy17; +#line 739 "ext/standard/var_unserializer.c" yy39: yych = *++YYCURSOR; - if(yych <= '/') goto yy17; - if(yych >= ':') goto yy17; - goto yy40; -yy40: ++YYCURSOR; + if(yych == '+') goto yy40; + if(yych <= '/') goto yy18; + if(yych <= '9') goto yy41; + goto yy18; +yy40: yych = *++YYCURSOR; + if(yych <= '/') goto yy18; + if(yych >= ':') goto yy18; + goto yy41; +yy41: ++YYCURSOR; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - goto yy41; -yy41: if(yych <= '/') goto yy17; - if(yych <= '9') goto yy40; - if(yych >= ';') goto yy17; goto yy42; -yy42: yych = *++YYCURSOR; - if(yych != '"') goto yy17; +yy42: if(yych <= '/') goto yy18; + if(yych <= '9') goto yy41; + if(yych >= ';') goto yy18; goto yy43; -yy43: ++YYCURSOR; +yy43: yych = *++YYCURSOR; + if(yych != '"') goto yy18; goto yy44; -yy44: -#line 451 "ext/standard/var_unserializer.re" +yy44: ++YYCURSOR; + goto yy45; +yy45: +#line 514 "ext/standard/var_unserializer.re" +{ + size_t len, maxlen; + UChar *ustr; + + len = parse_uiv(start + 2); + maxlen = max - YYCURSOR; + if (maxlen < len) { + *p = start + 2; + return 0; + } + + if ((ustr = unserialize_ustr(&YYCURSOR, len)) == NULL) { + efree(ustr); + return 0; + } + + if (*(YYCURSOR) != '"') { + efree(ustr); + *p = YYCURSOR; + return 0; + } + + YYCURSOR += 2; + *p = YYCURSOR; + + INIT_PZVAL(*rval); + ZVAL_UNICODEL(*rval, ustr, len, 0); + return 1; +} +#line 793 "ext/standard/var_unserializer.c" +yy46: yych = *++YYCURSOR; + if(yych == '+') goto yy47; + if(yych <= '/') goto yy18; + if(yych <= '9') goto yy48; + goto yy18; +yy47: yych = *++YYCURSOR; + if(yych <= '/') goto yy18; + if(yych >= ':') goto yy18; + goto yy48; +yy48: ++YYCURSOR; + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + goto yy49; +yy49: if(yych <= '/') goto yy18; + if(yych <= '9') goto yy48; + if(yych >= ';') goto yy18; + goto yy50; +yy50: yych = *++YYCURSOR; + if(yych != '"') goto yy18; + goto yy51; +yy51: ++YYCURSOR; + goto yy52; +yy52: +#line 486 "ext/standard/var_unserializer.re" { size_t len, maxlen; char *str; @@ -746,163 +841,163 @@ ZVAL_STRINGL(*rval, str, len, 1); return 1; } -#line 750 "ext/standard/var_unserializer.c" -yy45: yych = *++YYCURSOR; +#line 845 "ext/standard/var_unserializer.c" +yy53: yych = *++YYCURSOR; if(yych <= '/'){ if(yych <= ','){ - if(yych == '+') goto yy49; - goto yy17; + if(yych == '+') goto yy57; + goto yy18; } else { - if(yych <= '-') goto yy47; - if(yych <= '.') goto yy52; - goto yy17; + if(yych <= '-') goto yy55; + if(yych <= '.') goto yy60; + goto yy18; } } else { if(yych <= 'I'){ - if(yych <= '9') goto yy50; - if(yych <= 'H') goto yy17; - goto yy48; + if(yych <= '9') goto yy58; + if(yych <= 'H') goto yy18; + goto yy56; } else { - if(yych != 'N') goto yy17; - goto yy46; + if(yych != 'N') goto yy18; + goto yy54; } } -yy46: yych = *++YYCURSOR; - if(yych == 'A') goto yy68; - goto yy17; -yy47: yych = *++YYCURSOR; +yy54: yych = *++YYCURSOR; + if(yych == 'A') goto yy76; + goto yy18; +yy55: yych = *++YYCURSOR; if(yych <= '/'){ - if(yych == '.') goto yy52; - goto yy17; + if(yych == '.') goto yy60; + goto yy18; } else { - if(yych <= '9') goto yy50; - if(yych != 'I') goto yy17; - goto yy48; - } -yy48: yych = *++YYCURSOR; - if(yych == 'N') goto yy64; - goto yy17; -yy49: yych = *++YYCURSOR; - if(yych == '.') goto yy52; - if(yych <= '/') goto yy17; - if(yych >= ':') goto yy17; - goto yy50; -yy50: ++YYCURSOR; + if(yych <= '9') goto yy58; + if(yych != 'I') goto yy18; + goto yy56; + } +yy56: yych = *++YYCURSOR; + if(yych == 'N') goto yy72; + goto yy18; +yy57: yych = *++YYCURSOR; + if(yych == '.') goto yy60; + if(yych <= '/') goto yy18; + if(yych >= ':') goto yy18; + goto yy58; +yy58: ++YYCURSOR; if((YYLIMIT - YYCURSOR) < 4) YYFILL(4); yych = *YYCURSOR; - goto yy51; -yy51: if(yych <= ':'){ + goto yy59; +yy59: if(yych <= ':'){ if(yych <= '.'){ - if(yych <= '-') goto yy17; - goto yy62; + if(yych <= '-') goto yy18; + goto yy70; } else { - if(yych <= '/') goto yy17; - if(yych <= '9') goto yy50; - goto yy17; + if(yych <= '/') goto yy18; + if(yych <= '9') goto yy58; + goto yy18; } } else { if(yych <= 'E'){ - if(yych <= ';') goto yy55; - if(yych <= 'D') goto yy17; - goto yy57; + if(yych <= ';') goto yy63; + if(yych <= 'D') goto yy18; + goto yy65; } else { - if(yych == 'e') goto yy57; - goto yy17; + if(yych == 'e') goto yy65; + goto yy18; } } -yy52: yych = *++YYCURSOR; - if(yych <= '/') goto yy17; - if(yych >= ':') goto yy17; - goto yy53; -yy53: ++YYCURSOR; +yy60: yych = *++YYCURSOR; + if(yych <= '/') goto yy18; + if(yych >= ':') goto yy18; + goto yy61; +yy61: ++YYCURSOR; if((YYLIMIT - YYCURSOR) < 4) YYFILL(4); yych = *YYCURSOR; - goto yy54; -yy54: if(yych <= ';'){ - if(yych <= '/') goto yy17; - if(yych <= '9') goto yy53; - if(yych <= ':') goto yy17; - goto yy55; + goto yy62; +yy62: if(yych <= ';'){ + if(yych <= '/') goto yy18; + if(yych <= '9') goto yy61; + if(yych <= ':') goto yy18; + goto yy63; } else { if(yych <= 'E'){ - if(yych <= 'D') goto yy17; - goto yy57; + if(yych <= 'D') goto yy18; + goto yy65; } else { - if(yych == 'e') goto yy57; - goto yy17; + if(yych == 'e') goto yy65; + goto yy18; } } -yy55: ++YYCURSOR; - goto yy56; -yy56: -#line 444 "ext/standard/var_unserializer.re" +yy63: ++YYCURSOR; + goto yy64; +yy64: +#line 479 "ext/standard/var_unserializer.re" { *p = YYCURSOR; INIT_PZVAL(*rval); ZVAL_DOUBLE(*rval, zend_strtod((const char *)start + 2, NULL)); return 1; } -#line 846 "ext/standard/var_unserializer.c" -yy57: yych = *++YYCURSOR; +#line 941 "ext/standard/var_unserializer.c" +yy65: yych = *++YYCURSOR; if(yych <= ','){ - if(yych != '+') goto yy17; - goto yy58; + if(yych != '+') goto yy18; + goto yy66; } else { - if(yych <= '-') goto yy58; - if(yych <= '/') goto yy17; - if(yych <= '9') goto yy59; - goto yy17; + if(yych <= '-') goto yy66; + if(yych <= '/') goto yy18; + if(yych <= '9') goto yy67; + goto yy18; } -yy58: yych = *++YYCURSOR; +yy66: yych = *++YYCURSOR; if(yych <= ','){ - if(yych == '+') goto yy61; - goto yy17; + if(yych == '+') goto yy69; + goto yy18; } else { - if(yych <= '-') goto yy61; - if(yych <= '/') goto yy17; - if(yych >= ':') goto yy17; - goto yy59; + if(yych <= '-') goto yy69; + if(yych <= '/') goto yy18; + if(yych >= ':') goto yy18; + goto yy67; } -yy59: ++YYCURSOR; +yy67: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy60; -yy60: if(yych <= '/') goto yy17; - if(yych <= '9') goto yy59; - if(yych == ';') goto yy55; - goto yy17; -yy61: yych = *++YYCURSOR; - if(yych <= '/') goto yy17; - if(yych <= '9') goto yy59; - goto yy17; -yy62: ++YYCURSOR; + goto yy68; +yy68: if(yych <= '/') goto yy18; + if(yych <= '9') goto yy67; + if(yych == ';') goto yy63; + goto yy18; +yy69: yych = *++YYCURSOR; + if(yych <= '/') goto yy18; + if(yych <= '9') goto yy67; + goto yy18; +yy70: ++YYCURSOR; if((YYLIMIT - YYCURSOR) < 4) YYFILL(4); yych = *YYCURSOR; - goto yy63; -yy63: if(yych <= ';'){ - if(yych <= '/') goto yy17; - if(yych <= '9') goto yy62; - if(yych <= ':') goto yy17; - goto yy55; + goto yy71; +yy71: if(yych <= ';'){ + if(yych <= '/') goto yy18; + if(yych <= '9') goto yy70; + if(yych <= ':') goto yy18; + goto yy63; } else { if(yych <= 'E'){ - if(yych <= 'D') goto yy17; - goto yy57; + if(yych <= 'D') goto yy18; + goto yy65; } else { - if(yych == 'e') goto yy57; - goto yy17; + if(yych == 'e') goto yy65; + goto yy18; } } -yy64: yych = *++YYCURSOR; - if(yych != 'F') goto yy17; - goto yy65; -yy65: yych = *++YYCURSOR; - if(yych != ';') goto yy17; - goto yy66; -yy66: ++YYCURSOR; - goto yy67; -yy67: -#line 429 "ext/standard/var_unserializer.re" +yy72: yych = *++YYCURSOR; + if(yych != 'F') goto yy18; + goto yy73; +yy73: yych = *++YYCURSOR; + if(yych != ';') goto yy18; + goto yy74; +yy74: ++YYCURSOR; + goto yy75; +yy75: +#line 464 "ext/standard/var_unserializer.re" { *p = YYCURSOR; INIT_PZVAL(*rval); @@ -917,98 +1012,98 @@ return 1; } -#line 921 "ext/standard/var_unserializer.c" -yy68: yych = *++YYCURSOR; - if(yych == 'N') goto yy65; - goto yy17; -yy69: yych = *++YYCURSOR; +#line 1016 "ext/standard/var_unserializer.c" +yy76: yych = *++YYCURSOR; + if(yych == 'N') goto yy73; + goto yy18; +yy77: yych = *++YYCURSOR; if(yych <= ','){ - if(yych != '+') goto yy17; - goto yy70; + if(yych != '+') goto yy18; + goto yy78; } else { - if(yych <= '-') goto yy70; - if(yych <= '/') goto yy17; - if(yych <= '9') goto yy71; - goto yy17; - } -yy70: yych = *++YYCURSOR; - if(yych <= '/') goto yy17; - if(yych >= ':') goto yy17; - goto yy71; -yy71: ++YYCURSOR; + if(yych <= '-') goto yy78; + if(yych <= '/') goto yy18; + if(yych <= '9') goto yy79; + goto yy18; + } +yy78: yych = *++YYCURSOR; + if(yych <= '/') goto yy18; + if(yych >= ':') goto yy18; + goto yy79; +yy79: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy72; -yy72: if(yych <= '/') goto yy17; - if(yych <= '9') goto yy71; - if(yych != ';') goto yy17; - goto yy73; -yy73: ++YYCURSOR; - goto yy74; -yy74: -#line 422 "ext/standard/var_unserializer.re" + goto yy80; +yy80: if(yych <= '/') goto yy18; + if(yych <= '9') goto yy79; + if(yych != ';') goto yy18; + goto yy81; +yy81: ++YYCURSOR; + goto yy82; +yy82: +#line 457 "ext/standard/var_unserializer.re" { *p = YYCURSOR; INIT_PZVAL(*rval); ZVAL_LONG(*rval, parse_iv(start + 2)); return 1; } -#line 957 "ext/standard/var_unserializer.c" -yy75: yych = *++YYCURSOR; - if(yych <= '/') goto yy17; - if(yych >= '2') goto yy17; - goto yy76; -yy76: yych = *++YYCURSOR; - if(yych != ';') goto yy17; - goto yy77; -yy77: ++YYCURSOR; - goto yy78; -yy78: -#line 415 "ext/standard/var_unserializer.re" +#line 1052 "ext/standard/var_unserializer.c" +yy83: yych = *++YYCURSOR; + if(yych <= '/') goto yy18; + if(yych >= '2') goto yy18; + goto yy84; +yy84: yych = *++YYCURSOR; + if(yych != ';') goto yy18; + goto yy85; +yy85: ++YYCURSOR; + goto yy86; +yy86: +#line 450 "ext/standard/var_unserializer.re" { *p = YYCURSOR; INIT_PZVAL(*rval); ZVAL_BOOL(*rval, parse_iv(start + 2)); return 1; } -#line 975 "ext/standard/var_unserializer.c" -yy79: ++YYCURSOR; - goto yy80; -yy80: -#line 408 "ext/standard/var_unserializer.re" +#line 1070 "ext/standard/var_unserializer.c" +yy87: ++YYCURSOR; + goto yy88; +yy88: +#line 443 "ext/standard/var_unserializer.re" { *p = YYCURSOR; INIT_PZVAL(*rval); ZVAL_NULL(*rval); return 1; } -#line 986 "ext/standard/var_unserializer.c" -yy81: yych = *++YYCURSOR; +#line 1081 "ext/standard/var_unserializer.c" +yy89: yych = *++YYCURSOR; if(yych <= ','){ - if(yych != '+') goto yy17; - goto yy82; + if(yych != '+') goto yy18; + goto yy90; } else { - if(yych <= '-') goto yy82; - if(yych <= '/') goto yy17; - if(yych <= '9') goto yy83; - goto yy17; - } -yy82: yych = *++YYCURSOR; - if(yych <= '/') goto yy17; - if(yych >= ':') goto yy17; - goto yy83; -yy83: ++YYCURSOR; + if(yych <= '-') goto yy90; + if(yych <= '/') goto yy18; + if(yych <= '9') goto yy91; + goto yy18; + } +yy90: yych = *++YYCURSOR; + if(yych <= '/') goto yy18; + if(yych >= ':') goto yy18; + goto yy91; +yy91: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy84; -yy84: if(yych <= '/') goto yy17; - if(yych <= '9') goto yy83; - if(yych != ';') goto yy17; - goto yy85; -yy85: ++YYCURSOR; - goto yy86; -yy86: -#line 385 "ext/standard/var_unserializer.re" + goto yy92; +yy92: if(yych <= '/') goto yy18; + if(yych <= '9') goto yy91; + if(yych != ';') goto yy18; + goto yy93; +yy93: ++YYCURSOR; + goto yy94; +yy94: +#line 420 "ext/standard/var_unserializer.re" { long id; @@ -1031,33 +1126,33 @@ return 1; } -#line 1035 "ext/standard/var_unserializer.c" -yy87: yych = *++YYCURSOR; +#line 1130 "ext/standard/var_unserializer.c" +yy95: yych = *++YYCURSOR; if(yych <= ','){ - if(yych != '+') goto yy17; - goto yy88; + if(yych != '+') goto yy18; + goto yy96; } else { - if(yych <= '-') goto yy88; - if(yych <= '/') goto yy17; - if(yych <= '9') goto yy89; - goto yy17; - } -yy88: yych = *++YYCURSOR; - if(yych <= '/') goto yy17; - if(yych >= ':') goto yy17; - goto yy89; -yy89: ++YYCURSOR; + if(yych <= '-') goto yy96; + if(yych <= '/') goto yy18; + if(yych <= '9') goto yy97; + goto yy18; + } +yy96: yych = *++YYCURSOR; + if(yych <= '/') goto yy18; + if(yych >= ':') goto yy18; + goto yy97; +yy97: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy90; -yy90: if(yych <= '/') goto yy17; - if(yych <= '9') goto yy89; - if(yych != ';') goto yy17; - goto yy91; -yy91: ++YYCURSOR; - goto yy92; -yy92: -#line 364 "ext/standard/var_unserializer.re" + goto yy98; +yy98: if(yych <= '/') goto yy18; + if(yych <= '9') goto yy97; + if(yych != ';') goto yy18; + goto yy99; +yy99: ++YYCURSOR; + goto yy100; +yy100: +#line 399 "ext/standard/var_unserializer.re" { long id; @@ -1078,10 +1173,10 @@ return 1; } -#line 1082 "ext/standard/var_unserializer.c" +#line 1177 "ext/standard/var_unserializer.c" } } -#line 629 "ext/standard/var_unserializer.re" +#line 695 "ext/standard/var_unserializer.re" return 0; http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/var_unserializer.re?r1=1.57&r2=1.58&diff_format=u Index: php-src/ext/standard/var_unserializer.re diff -u php-src/ext/standard/var_unserializer.re:1.57 php-src/ext/standard/var_unserializer.re:1.58 --- php-src/ext/standard/var_unserializer.re:1.57 Thu Mar 2 13:12:45 2006 +++ php-src/ext/standard/var_unserializer.re Mon Mar 27 13:37:46 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: var_unserializer.re,v 1.57 2006/03/02 13:12:45 dmitry Exp $ */ +/* $Id: var_unserializer.re,v 1.58 2006/03/27 13:37:46 dmitry Exp $ */ #include "php.h" #include "ext/standard/php_var.h" @@ -78,6 +78,38 @@ var_hash->data[var_hash->used_slots++] = *rval; } +static UChar *unserialize_ustr(const unsigned char **p, int len) +{ + int i, j; + UChar *ustr = eumalloc(len+1); + + for (i = 0; i < len; i++) { + if (**p != '\\') { + ustr[i] = (UChar)**p; + } else { + UChar ch = 0; + + for (j = 0; j < 4; j++) { + (*p)++; + if (**p >= '0' && **p <= '9') { + ch = (ch << 4) + (**p -'0'); + } else if (**p >= 'a' && **p <= 'f') { + ch = (ch << 4) + (**p -'a'+10); + } else if (**p >= 'A' && **p <= 'F') { + ch = (ch << 4) + (**p -'A'+10); + } else { + efree(ustr); + return NULL; + } + } + ustr[i] = ch; + } + (*p)++; + } + ustr[i] = 0; + return ustr; +} + PHPAPI void var_replace(php_unserialize_data_t *var_hashx, zval *ozval, zval **nzval) { long i; @@ -227,7 +259,9 @@ return 0; } - if (Z_TYPE_P(key) != IS_LONG && Z_TYPE_P(key) != IS_STRING) { + if (Z_TYPE_P(key) != IS_LONG && + Z_TYPE_P(key) != IS_STRING && + Z_TYPE_P(key) != IS_UNICODE) { zval_dtor(key); FREE_ZVAL(key); return 0; @@ -251,10 +285,11 @@ zend_hash_index_update(ht, Z_LVAL_P(key), &data, sizeof(data), NULL); break; case IS_STRING: - if (zend_hash_find(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, (void **)&old_data)==SUCCESS) { + case IS_UNICODE: + if (zend_u_hash_find(ht, Z_TYPE_P(key), Z_UNIVAL_P(key), Z_UNILEN_P(key) + 1, (void **)&old_data)==SUCCESS) { var_push_dtor(var_hash, old_data); } - zend_hash_update(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &data, sizeof(data), NULL); + zend_u_hash_update(ht, Z_TYPE_P(key), Z_UNIVAL_P(key), Z_UNILEN_P(key) + 1, &data, sizeof(data), NULL); break; } @@ -476,6 +511,36 @@ return 1; } +"U:" uiv ":" ["] { + size_t len, maxlen; + UChar *ustr; + + len = parse_uiv(start + 2); + maxlen = max - YYCURSOR; + if (maxlen < len) { + *p = start + 2; + return 0; + } + + if ((ustr = unserialize_ustr(&YYCURSOR, len)) == NULL) { + efree(ustr); + return 0; + } + + if (*(YYCURSOR) != '"') { + efree(ustr); + *p = YYCURSOR; + return 0; + } + + YYCURSOR += 2; + *p = YYCURSOR; + + INIT_PZVAL(*rval); + ZVAL_UNICODEL(*rval, ustr, len, 0); + return 1; +} + "a:" uiv ":" "{" { long elements = parse_iv(start + 2); /* use iv() not uiv() in order to check data range */ @@ -509,7 +574,7 @@ object ":" uiv ":" ["] { size_t len, len2, len3, maxlen; long elements; - char *class_name; + zstr class_name; zend_class_entry *ce; zend_class_entry **pce; int incomplete_class = 0; @@ -533,31 +598,32 @@ return 0; } - class_name = (char*)YYCURSOR; - - YYCURSOR += len; + if (UG(unicode)) { + class_name.u = unserialize_ustr(&YYCURSOR, len); + } else { + len3 = strspn((char*)YYCURSOR, "0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377"); + if (len3 != len) { + *p = YYCURSOR + len3 - len; + return 0; + } + class_name.s = estrndup((char*)YYCURSOR, len); + YYCURSOR += len; + } if (*(YYCURSOR) != '"') { + efree(class_name.v); *p = YYCURSOR; return 0; } if (*(YYCURSOR+1) != ':') { + efree(class_name.v); *p = YYCURSOR+1; return 0; } - len3 = strspn(class_name, "0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377"); - if (len3 != len) - { - *p = YYCURSOR + len3 - len; - return 0; - } - - class_name = estrndup(class_name, len); - do { /* Try to find class directly */ - if (zend_lookup_class(class_name, len2, &pce TSRMLS_CC) == SUCCESS) { + if (zend_u_lookup_class(UG(unicode)?IS_UNICODE:IS_STRING, class_name, len2, &pce TSRMLS_CC) == SUCCESS) { ce = *pce; break; } @@ -574,7 +640,7 @@ ZVAL_STRING(user_func, PG(unserialize_callback_func), 1); args[0] = &arg_func_name; MAKE_STD_ZVAL(arg_func_name); - ZVAL_STRING(arg_func_name, class_name, 1); + ZVAL_TEXT(arg_func_name, class_name, 1); if (call_user_function_ex(CG(function_table), NULL, user_func, &retval_ptr, 1, args, 0, NULL TSRMLS_CC) != SUCCESS) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "defined (%s) but not found", user_func->value.str.val); incomplete_class = 1; @@ -588,7 +654,7 @@ } /* The callback function may have defined the class */ - if (zend_lookup_class(class_name, len2, &pce TSRMLS_CC) == SUCCESS) { + if (zend_u_lookup_class(UG(unicode)?IS_UNICODE:IS_STRING, class_name, len2, &pce TSRMLS_CC) == SUCCESS) { ce = *pce; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Function %s() hasn't defined the class it was called for", user_func->value.str.val); @@ -604,7 +670,7 @@ *p = YYCURSOR; if(custom_object) { - efree(class_name); + efree(class_name.v); return object_custom(UNSERIALIZE_PASSTHRU, ce); } @@ -613,7 +679,7 @@ if (incomplete_class) { php_store_class_name(*rval, class_name, len2); } - efree(class_name); + efree(class_name.v); return object_common2(UNSERIALIZE_PASSTHRU, elements); } http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/tests/serialize/001.phpt?r1=1.7&r2=1.8&diff_format=u Index: php-src/ext/standard/tests/serialize/001.phpt diff -u php-src/ext/standard/tests/serialize/001.phpt:1.7 php-src/ext/standard/tests/serialize/001.phpt:1.8 --- php-src/ext/standard/tests/serialize/001.phpt:1.7 Wed May 19 08:45:23 2004 +++ php-src/ext/standard/tests/serialize/001.phpt Mon Mar 27 13:37:47 2006 @@ -118,3 +118,48 @@ ["b"]=> &string(4) "test" } +--UEXPECTF-- +N; +b:1; +b:0; +i:1; +i:0; +i:-1; +i:2147483647; +i:-2147483647; +d:1.123456789000000011213842299184761941432952880859375; +d:1; +d:0; +d:-1; +d:-1.123456789000000011213842299184761941432952880859375; +U:5:"hallo"; +a:6:{i:0;i:1;i:1;d:1.100000000000000088817841970012523233890533447265625;i:2;U:5:"hallo";i:3;N;i:4;b:1;i:5;a:0:{}} +O:1:"t":1:{U:1:"a";U:5:"hallo";} +object(t)#%d (1) { + [u"a"]=> + unicode(5) "hallo" +} +__sleep called +O:1:"s":2:{U:1:"a";U:5:"hallo";U:1:"c";U:5:"world";} +__wakeup called +object(s)#%d (3) { + [u"a"]=> + unicode(5) "hallo" + [u"b"]=> + NULL + [u"c"]=> + unicode(5) "world" +} +array(2) { + [u"a"]=> + &unicode(4) "test" + [u"b"]=> + &unicode(4) "test" +} +a:2:{U:1:"a";U:4:"test";U:1:"b";R:2;} +array(2) { + [u"a"]=> + &unicode(4) "test" + [u"b"]=> + &unicode(4) "test" +} http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/tests/serialize/005.phpt?r1=1.3&r2=1.4&diff_format=u Index: php-src/ext/standard/tests/serialize/005.phpt diff -u php-src/ext/standard/tests/serialize/005.phpt:1.3 php-src/ext/standard/tests/serialize/005.phpt:1.4 --- php-src/ext/standard/tests/serialize/005.phpt:1.3 Tue Apr 5 09:18:18 2005 +++ php-src/ext/standard/tests/serialize/005.phpt Mon Mar 27 13:37:47 2006 @@ -184,3 +184,55 @@ string(22) "autoload_not_available" } ===DONE=== +--UEXPECTF-- +===O1=== +TestOld::__sleep() +unicode(18) "O:7:"TestOld":0:{}" +TestOld::__wakeup() +object(TestOld)#%d (0) { +} +===N1=== +TestNew::serialize() +unicode(2) "N;" +NULL +===N2=== +TestNew::serialize() +unicode(19) "C:7:"TestNew":1:{2}" +TestNew::unserialize() +object(TestNew)#%d (0) { +} +===NAOld=== +unserializer(TestNAOld) +TestOld::__wakeup() +object(TestNAOld)#%d (0) { +} +===NANew=== +unserializer(TestNANew) +TestNew::__wakeup() +object(TestNANew)#%d (0) { +} +===NANew2=== +unserializer(TestNANew2) +TestNew::unserialize() +object(TestNANew2)#%d (0) { +} +===AutoOld=== +unserializer(autoload_implements) +Try __autoload() +do_autoload(autoload_interface) +do_autoload(autoload_implements) +object(autoload_implements)#%d (0) { +} +===AutoNA=== +do_autoload(autoload_not_available) +unserializer(autoload_not_available) +Try __autoload() +do_autoload(autoload_not_available) +do_autoload(autoload_not_available) + +Warning: unserialize(): Function unserializer() hasn't defined the class it was called for in %s005.php on line %d +object(__PHP_Incomplete_Class)#1 (1) { + [u"__PHP_Incomplete_Class_Name"]=> + unicode(22) "autoload_not_available" +} +===DONE=== http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/tests/serialize/006.phpt?r1=1.2&r2=1.3&diff_format=u Index: php-src/ext/standard/tests/serialize/006.phpt diff -u php-src/ext/standard/tests/serialize/006.phpt:1.2 php-src/ext/standard/tests/serialize/006.phpt:1.3 --- php-src/ext/standard/tests/serialize/006.phpt:1.2 Wed Aug 17 14:01:06 2005 +++ php-src/ext/standard/tests/serialize/006.phpt Mon Mar 27 13:37:47 2006 @@ -30,3 +30,14 @@ ["åäöÅÄÖ"]=> string(6) "åäöÅÄÖ" } +--UEXPECT-- +unicode(131) "O:11:"\00dcberK\00f6\00f6li\00e4\00e5":1:{U:11:"\00e5\00e4\00f6\00c5\00c4\00d6\00fc\00dcber";U:6:"\00e5\00e4\00f6\00c5\00c4\00d6";}" +object(ÜberKööliäå)#2 (1) { + [u"åäöÅÄÖüÜber"]=> + unicode(6) "åäöÅÄÖ" +} +unicode(80) "a:1:{U:6:"\00e5\00e4\00f6\00c5\00c4\00d6";U:6:"\00e5\00e4\00f6\00c5\00c4\00d6";}" +array(1) { + [u"åäöÅÄÖ"]=> + unicode(6) "åäöÅÄÖ" +} http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/tests/serialize/bug14293.phpt?r1=1.3&r2=1.4&diff_format=u Index: php-src/ext/standard/tests/serialize/bug14293.phpt diff -u php-src/ext/standard/tests/serialize/bug14293.phpt:1.3 php-src/ext/standard/tests/serialize/bug14293.phpt:1.4 --- php-src/ext/standard/tests/serialize/bug14293.phpt:1.3 Thu Sep 2 18:24:58 2004 +++ php-src/ext/standard/tests/serialize/bug14293.phpt Mon Mar 27 13:37:47 2006 @@ -34,3 +34,14 @@ ["b"]=> NULL } +--UEXPECTF-- +__sleep called + +Notice: serialize(): "b" returned as member variable from __sleep() but does not exist in %sbug14293.php on line %d +O:1:"t":2:{U:1:"a";U:5:"hello";U:1:"b";N;} +object(t)#%d (2) { + [u"a"]=> + unicode(5) "hello" + [u"b"]=> + NULL +} http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/tests/serialize/bug21957.phpt?r1=1.2&r2=1.3&diff_format=u Index: php-src/ext/standard/tests/serialize/bug21957.phpt diff -u php-src/ext/standard/tests/serialize/bug21957.phpt:1.2 php-src/ext/standard/tests/serialize/bug21957.phpt:1.3 --- php-src/ext/standard/tests/serialize/bug21957.phpt:1.2 Sun Nov 30 13:57:18 2003 +++ php-src/ext/standard/tests/serialize/bug21957.phpt Mon Mar 27 13:37:47 2006 @@ -47,3 +47,22 @@ ["two"]=> NULL } +--UEXPECT-- +array(2) { + [u"one"]=> + unicode(3) "ABC" + [u"two"]=> + object(test)#1 (2) { + [u"a"]=> + int(7) + [u"b"]=> + int(2) + } +} +a:2:{U:3:"one";U:3:"ABC";U:3:"two";N;} +array(2) { + [u"one"]=> + unicode(3) "ABC" + [u"two"]=> + NULL +} http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/tests/serialize/bug26762.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/standard/tests/serialize/bug26762.phpt diff -u php-src/ext/standard/tests/serialize/bug26762.phpt:1.1 php-src/ext/standard/tests/serialize/bug26762.phpt:1.2 --- php-src/ext/standard/tests/serialize/bug26762.phpt:1.1 Fri Jan 2 03:24:38 2004 +++ php-src/ext/standard/tests/serialize/bug26762.phpt Mon Mar 27 13:37:47 2006 @@ -25,3 +25,5 @@ ?> --EXPECTF-- string(3) "FOO" +--UEXPECTF-- +unicode(3) "FOO" http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/tests/serialize/bug27469.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/standard/tests/serialize/bug27469.phpt diff -u php-src/ext/standard/tests/serialize/bug27469.phpt:1.1 php-src/ext/standard/tests/serialize/bug27469.phpt:1.2 --- php-src/ext/standard/tests/serialize/bug27469.phpt:1.1 Thu Mar 18 16:54:35 2004 +++ php-src/ext/standard/tests/serialize/bug27469.phpt Mon Mar 27 13:37:47 2006 @@ -25,3 +25,18 @@ ["__PHP_Incomplete_Class_Name"]=> string(9) "TestClass" } +--UEXPECT-- +object(__PHP_Incomplete_Class)#1 (1) { + [u"__PHP_Incomplete_Class_Name"]=> + unicode(9) "TestClass" +} +O:9:"TestClass":0:{} +object(__PHP_Incomplete_Class)#1 (1) { + [u"__PHP_Incomplete_Class_Name"]=> + unicode(9) "TestClass" +} +O:9:"TestClass":0:{} +object(__PHP_Incomplete_Class)#1 (1) { + [u"__PHP_Incomplete_Class_Name"]=> + unicode(9) "TestClass" +} http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/tests/serialize/bug28325.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/standard/tests/serialize/bug28325.phpt diff -u php-src/ext/standard/tests/serialize/bug28325.phpt:1.1 php-src/ext/standard/tests/serialize/bug28325.phpt:1.2 --- php-src/ext/standard/tests/serialize/bug28325.phpt:1.1 Mon Jul 5 07:53:41 2004 +++ php-src/ext/standard/tests/serialize/bug28325.phpt Mon Mar 27 13:37:47 2006 @@ -37,3 +37,23 @@ } } } +--UEXPECTF-- +object(a)#%d (1) { + [u"b"]=> + object(b)#%d (1) { + [u"c"]=> + object(c)#%d (1) { + [u"d"]=> + object(a)#%d (1) { + [u"b"]=> + object(b)#%d (1) { + [u"c"]=> + object(c)#%d (1) { + [u"d"]=> + *RECURSION* + } + } + } + } + } +} http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/tests/serialize/bug31402.phpt?r1=1.3&r2=1.4&diff_format=u Index: php-src/ext/standard/tests/serialize/bug31402.phpt diff -u php-src/ext/standard/tests/serialize/bug31402.phpt:1.3 php-src/ext/standard/tests/serialize/bug31402.phpt:1.4 --- php-src/ext/standard/tests/serialize/bug31402.phpt:1.3 Fri Mar 11 00:22:28 2005 +++ php-src/ext/standard/tests/serialize/bug31402.phpt Mon Mar 27 13:37:47 2006 @@ -85,3 +85,55 @@ } } ===DONE=== +--UEXPECTF-- +object(TestY)#%d (2) { + [u"A"]=> + array(3) { + [1]=> + object(TestX)#%d (1) { + [u"i"]=> + int(1) + } + [2]=> + &object(TestX)#%d (1) { + [u"i"]=> + int(2) + } + [3]=> + &object(TestX)#%d (1) { + [u"i"]=> + int(2) + } + } + [u"B"]=> + object(TestX)#%d (1) { + [u"i"]=> + int(1) + } +} +object(TestY)#%d (2) { + [u"A"]=> + array(3) { + [1]=> + object(TestX)#%d (1) { + [u"i"]=> + int(1) + } + [2]=> + &object(TestX)#%d (1) { + [u"i"]=> + int(2) + } + [3]=> + &object(TestX)#%d (1) { + [u"i"]=> + int(2) + } + } + [u"B"]=> + object(TestX)#%d (1) { + [u"i"]=> + int(1) + } +} +===DONE===
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php