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

Reply via email to