summaryrefslogtreecommitdiff
path: root/ext/standard/var_unserializer.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/var_unserializer.c')
-rw-r--r--ext/standard/var_unserializer.c446
1 files changed, 218 insertions, 228 deletions
diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c
index f48c44660c..7e429a40bd 100644
--- a/ext/standard/var_unserializer.c
+++ b/ext/standard/var_unserializer.c
@@ -23,6 +23,7 @@
#include "php.h"
#include "ext/standard/php_var.h"
#include "php_incomplete_class.h"
+#include "zend_portability.h"
struct php_unserialize_data {
void *first;
@@ -232,14 +233,14 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx)
}
}
- zval_ptr_dtor(zv);
+ i_zval_ptr_dtor(zv ZEND_FILE_LINE_CC);
}
next = var_dtor_hash->next;
efree_size(var_dtor_hash, sizeof(var_dtor_entries));
var_dtor_hash = next;
}
- zval_ptr_dtor(&wakeup_name);
+ zval_ptr_dtor_nogc(&wakeup_name);
}
/* }}} */
@@ -316,7 +317,7 @@ static inline int unserialize_allowed_class(
#define YYMARKER marker
-#line 324 "ext/standard/var_unserializer.re"
+#line 325 "ext/standard/var_unserializer.re"
@@ -352,10 +353,6 @@ static inline size_t parse_uiv(const unsigned char *p)
unsigned char cursor;
size_t result = 0;
- if (*p == '+') {
- p++;
- }
-
while (1) {
cursor = *p;
if (cursor >= '0' && cursor <= '9') {
@@ -382,7 +379,7 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab
ZVAL_UNDEF(&key);
if (!php_var_unserialize_internal(&key, p, max, NULL)) {
- zval_dtor(&key);
+ zval_ptr_dtor(&key);
return 0;
}
@@ -412,38 +409,82 @@ numeric_key:
data = zend_hash_add_new(ht, Z_STR(key), &d);
}
} else {
- zval_dtor(&key);
+ zval_ptr_dtor(&key);
return 0;
}
} else {
if (EXPECTED(Z_TYPE(key) == IS_STRING)) {
string_key:
- if ((old_data = zend_hash_find(ht, Z_STR(key))) != NULL) {
- if (Z_TYPE_P(old_data) == IS_INDIRECT) {
- old_data = Z_INDIRECT_P(old_data);
+ {
+ zend_property_info *existing_propinfo;
+ zend_string *new_key, *unmangled;
+ const char *unmangled_class = NULL;
+ const char *unmangled_prop;
+ size_t unmangled_prop_len;
+
+ if (UNEXPECTED(zend_unmangle_property_name_ex(Z_STR(key), &unmangled_class, &unmangled_prop, &unmangled_prop_len) == FAILURE)) {
+ zval_ptr_dtor(&key);
+ return 0;
+ }
+
+ unmangled = zend_string_init(unmangled_prop, unmangled_prop_len, 0);
+ if (Z_TYPE_P(rval) == IS_OBJECT
+ && ((existing_propinfo = zend_hash_find_ptr(&Z_OBJCE_P(rval)->properties_info, unmangled)) != NULL)
+ && (existing_propinfo->flags & ZEND_ACC_PPP_MASK)) {
+ if (existing_propinfo->flags & ZEND_ACC_PROTECTED) {
+ new_key = zend_mangle_property_name(
+ "*", 1, ZSTR_VAL(unmangled), ZSTR_LEN(unmangled), Z_OBJCE_P(rval)->type & ZEND_INTERNAL_CLASS);
+ zend_string_release(unmangled);
+ } else if (existing_propinfo->flags & ZEND_ACC_PRIVATE) {
+ if (unmangled_class != NULL && strcmp(unmangled_class, "*") != 0) {
+ new_key = zend_mangle_property_name(
+ unmangled_class, strlen(unmangled_class),
+ ZSTR_VAL(unmangled), ZSTR_LEN(unmangled),
+ Z_OBJCE_P(rval)->type & ZEND_INTERNAL_CLASS);
+ } else {
+ new_key = zend_mangle_property_name(
+ ZSTR_VAL(existing_propinfo->ce->name), ZSTR_LEN(existing_propinfo->ce->name),
+ ZSTR_VAL(unmangled), ZSTR_LEN(unmangled),
+ Z_OBJCE_P(rval)->type & ZEND_INTERNAL_CLASS);
+ }
+ zend_string_release(unmangled);
+ } else {
+ ZEND_ASSERT(existing_propinfo->flags & ZEND_ACC_PUBLIC);
+ new_key = unmangled;
+ }
+ zend_string_release(Z_STR(key));
+ ZVAL_STR(&key, new_key);
+ } else {
+ zend_string_release(unmangled);
+ }
+
+ if ((old_data = zend_hash_find(ht, Z_STR(key))) != NULL) {
+ if (Z_TYPE_P(old_data) == IS_INDIRECT) {
+ old_data = Z_INDIRECT_P(old_data);
+ }
+ var_push_dtor(var_hash, old_data);
+ data = zend_hash_update_ind(ht, Z_STR(key), &d);
+ } else {
+ data = zend_hash_add_new(ht, Z_STR(key), &d);
}
- var_push_dtor(var_hash, old_data);
- data = zend_hash_update_ind(ht, Z_STR(key), &d);
- } else {
- data = zend_hash_add_new(ht, Z_STR(key), &d);
}
} else if (Z_TYPE(key) == IS_LONG) {
/* object properties should include no integers */
convert_to_string(&key);
goto string_key;
} else {
- zval_dtor(&key);
+ zval_ptr_dtor(&key);
return 0;
}
}
if (!php_var_unserialize_internal(data, p, max, var_hash)) {
- zval_dtor(&key);
+ zval_ptr_dtor(&key);
return 0;
}
var_push_dtor(var_hash, data);
- zval_dtor(&key);
+ zval_ptr_dtor(&key);
if (elements && *(*p-1) != ';' && *(*p-1) != '}') {
(*p)--;
@@ -603,7 +644,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER)
start = cursor;
-#line 607 "ext/standard/var_unserializer.c"
+#line 648 "ext/standard/var_unserializer.c"
{
YYCTYPE yych;
static const unsigned char yybm[] = {
@@ -661,9 +702,9 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER)
yy2:
++YYCURSOR;
yy3:
-#line 982 "ext/standard/var_unserializer.re"
+#line 1035 "ext/standard/var_unserializer.re"
{ return 0; }
-#line 667 "ext/standard/var_unserializer.c"
+#line 708 "ext/standard/var_unserializer.c"
yy4:
yych = *(YYMARKER = ++YYCURSOR);
if (yych == ':') goto yy17;
@@ -710,288 +751,236 @@ yy14:
goto yy3;
yy15:
++YYCURSOR;
-#line 976 "ext/standard/var_unserializer.re"
+#line 1029 "ext/standard/var_unserializer.re"
{
/* this is the case where we have less data than planned */
php_error_docref(NULL, E_NOTICE, "Unexpected end of serialized data");
return 0; /* not sure if it should be 0 or 1 here? */
}
-#line 720 "ext/standard/var_unserializer.c"
+#line 761 "ext/standard/var_unserializer.c"
yy17:
yych = *++YYCURSOR;
if (yybm[0+yych] & 128) {
- goto yy31;
+ goto yy30;
}
- if (yych == '+') goto yy30;
yy18:
YYCURSOR = YYMARKER;
goto yy3;
yy19:
++YYCURSOR;
-#line 660 "ext/standard/var_unserializer.re"
+#line 701 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
ZVAL_NULL(rval);
return 1;
}
-#line 738 "ext/standard/var_unserializer.c"
+#line 778 "ext/standard/var_unserializer.c"
yy21:
yych = *++YYCURSOR;
- if (yych <= ',') {
- if (yych == '+') goto yy33;
- goto yy18;
- } else {
- if (yych <= '-') goto yy33;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy34;
- goto yy18;
- }
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy32;
+ goto yy18;
yy22:
yych = *++YYCURSOR;
- if (yych == '+') goto yy36;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy37;
+ if (yych <= '9') goto yy34;
goto yy18;
yy23:
yych = *++YYCURSOR;
- if (yych == '+') goto yy39;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy40;
+ if (yych <= '9') goto yy36;
goto yy18;
yy24:
yych = *++YYCURSOR;
if (yych <= '/') goto yy18;
- if (yych <= '1') goto yy42;
+ if (yych <= '1') goto yy38;
goto yy18;
yy25:
yych = *++YYCURSOR;
if (yych <= '/') {
if (yych <= ',') {
- if (yych == '+') goto yy43;
+ if (yych == '+') goto yy39;
goto yy18;
} else {
- if (yych <= '-') goto yy44;
- if (yych <= '.') goto yy45;
+ if (yych <= '-') goto yy40;
+ if (yych <= '.') goto yy41;
goto yy18;
}
} else {
if (yych <= 'I') {
- if (yych <= '9') goto yy46;
+ if (yych <= '9') goto yy42;
if (yych <= 'H') goto yy18;
- goto yy48;
+ goto yy44;
} else {
- if (yych == 'N') goto yy49;
+ if (yych == 'N') goto yy45;
goto yy18;
}
}
yy26:
yych = *++YYCURSOR;
if (yych <= ',') {
- if (yych == '+') goto yy50;
+ if (yych == '+') goto yy46;
goto yy18;
} else {
- if (yych <= '-') goto yy50;
+ if (yych <= '-') goto yy46;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy51;
+ if (yych <= '9') goto yy47;
goto yy18;
}
yy27:
yych = *++YYCURSOR;
- if (yych <= ',') {
- if (yych == '+') goto yy53;
- goto yy18;
- } else {
- if (yych <= '-') goto yy53;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy54;
- goto yy18;
- }
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy49;
+ goto yy18;
yy28:
yych = *++YYCURSOR;
- if (yych <= ',') {
- if (yych == '+') goto yy56;
- goto yy18;
- } else {
- if (yych <= '-') goto yy56;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy57;
- goto yy18;
- }
+ if (yych <= '/') goto yy18;
+ if (yych <= '9') goto yy51;
+ goto yy18;
yy29:
yych = *++YYCURSOR;
- if (yych == '+') goto yy59;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy60;
+ if (yych <= '9') goto yy53;
goto yy18;
yy30:
- yych = *++YYCURSOR;
- if (yybm[0+yych] & 128) {
- goto yy31;
- }
- goto yy18;
-yy31:
++YYCURSOR;
if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
if (yybm[0+yych] & 128) {
- goto yy31;
+ goto yy30;
}
if (yych <= '/') goto yy18;
- if (yych <= ':') goto yy62;
+ if (yych <= ':') goto yy55;
goto yy18;
-yy33:
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych >= ':') goto yy18;
-yy34:
+yy32:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy34;
- if (yych == ';') goto yy63;
+ if (yych <= '9') goto yy32;
+ if (yych == ';') goto yy56;
goto yy18;
-yy36:
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych >= ':') goto yy18;
-yy37:
+yy34:
++YYCURSOR;
if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy37;
- if (yych <= ':') goto yy65;
+ if (yych <= '9') goto yy34;
+ if (yych <= ':') goto yy58;
goto yy18;
-yy39:
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych >= ':') goto yy18;
-yy40:
+yy36:
++YYCURSOR;
if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy40;
- if (yych <= ':') goto yy66;
+ if (yych <= '9') goto yy36;
+ if (yych <= ':') goto yy59;
goto yy18;
-yy42:
+yy38:
yych = *++YYCURSOR;
- if (yych == ';') goto yy67;
+ if (yych == ';') goto yy60;
goto yy18;
-yy43:
+yy39:
yych = *++YYCURSOR;
- if (yych == '.') goto yy45;
+ if (yych == '.') goto yy41;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy46;
+ if (yych <= '9') goto yy42;
goto yy18;
-yy44:
+yy40:
yych = *++YYCURSOR;
if (yych <= '/') {
if (yych != '.') goto yy18;
} else {
- if (yych <= '9') goto yy46;
- if (yych == 'I') goto yy48;
+ if (yych <= '9') goto yy42;
+ if (yych == 'I') goto yy44;
goto yy18;
}
-yy45:
+yy41:
yych = *++YYCURSOR;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy69;
+ if (yych <= '9') goto yy62;
goto yy18;
-yy46:
+yy42:
++YYCURSOR;
- if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
+ if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
yych = *YYCURSOR;
if (yych <= ':') {
if (yych <= '.') {
if (yych <= '-') goto yy18;
- goto yy69;
+ goto yy62;
} else {
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy46;
+ if (yych <= '9') goto yy42;
goto yy18;
}
} else {
if (yych <= 'E') {
- if (yych <= ';') goto yy71;
+ if (yych <= ';') goto yy64;
if (yych <= 'D') goto yy18;
- goto yy73;
+ goto yy66;
} else {
- if (yych == 'e') goto yy73;
+ if (yych == 'e') goto yy66;
goto yy18;
}
}
-yy48:
+yy44:
yych = *++YYCURSOR;
- if (yych == 'N') goto yy74;
+ if (yych == 'N') goto yy67;
goto yy18;
-yy49:
+yy45:
yych = *++YYCURSOR;
- if (yych == 'A') goto yy75;
+ if (yych == 'A') goto yy68;
goto yy18;
-yy50:
+yy46:
yych = *++YYCURSOR;
if (yych <= '/') goto yy18;
if (yych >= ':') goto yy18;
-yy51:
+yy47:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy51;
- if (yych == ';') goto yy76;
+ if (yych <= '9') goto yy47;
+ if (yych == ';') goto yy69;
goto yy18;
-yy53:
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych >= ':') goto yy18;
-yy54:
+yy49:
++YYCURSOR;
if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy54;
- if (yych <= ':') goto yy78;
+ if (yych <= '9') goto yy49;
+ if (yych <= ':') goto yy71;
goto yy18;
-yy56:
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych >= ':') goto yy18;
-yy57:
+yy51:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy57;
- if (yych == ';') goto yy79;
+ if (yych <= '9') goto yy51;
+ if (yych == ';') goto yy72;
goto yy18;
-yy59:
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych >= ':') goto yy18;
-yy60:
+yy53:
++YYCURSOR;
if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy60;
- if (yych <= ':') goto yy81;
+ if (yych <= '9') goto yy53;
+ if (yych <= ':') goto yy74;
goto yy18;
-yy62:
+yy55:
yych = *++YYCURSOR;
- if (yych == '"') goto yy82;
+ if (yych == '"') goto yy75;
goto yy18;
-yy63:
+yy56:
++YYCURSOR;
-#line 611 "ext/standard/var_unserializer.re"
+#line 652 "ext/standard/var_unserializer.re"
{
zend_long id;
*p = YYCURSOR;
if (!var_hash) return 0;
- id = parse_iv(start + 2) - 1;
+ id = parse_uiv(start + 2) - 1;
if (id == -1 || (rval_ref = var_access(var_hash, id)) == NULL) {
return 0;
}
@@ -1009,44 +998,44 @@ yy63:
return 1;
}
-#line 1013 "ext/standard/var_unserializer.c"
-yy65:
+#line 1002 "ext/standard/var_unserializer.c"
+yy58:
yych = *++YYCURSOR;
- if (yych == '"') goto yy84;
+ if (yych == '"') goto yy77;
goto yy18;
-yy66:
+yy59:
yych = *++YYCURSOR;
- if (yych == '{') goto yy86;
+ if (yych == '{') goto yy79;
goto yy18;
-yy67:
+yy60:
++YYCURSOR;
-#line 666 "ext/standard/var_unserializer.re"
+#line 707 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
ZVAL_BOOL(rval, parse_iv(start + 2));
return 1;
}
-#line 1030 "ext/standard/var_unserializer.c"
-yy69:
+#line 1019 "ext/standard/var_unserializer.c"
+yy62:
++YYCURSOR;
- if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
+ if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
yych = *YYCURSOR;
if (yych <= ';') {
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy69;
+ if (yych <= '9') goto yy62;
if (yych <= ':') goto yy18;
} else {
if (yych <= 'E') {
if (yych <= 'D') goto yy18;
- goto yy73;
+ goto yy66;
} else {
- if (yych == 'e') goto yy73;
+ if (yych == 'e') goto yy66;
goto yy18;
}
}
-yy71:
+yy64:
++YYCURSOR;
-#line 714 "ext/standard/var_unserializer.re"
+#line 755 "ext/standard/var_unserializer.re"
{
#if SIZEOF_ZEND_LONG == 4
use_double:
@@ -1055,29 +1044,29 @@ use_double:
ZVAL_DOUBLE(rval, zend_strtod((const char *)start + 2, NULL));
return 1;
}
-#line 1059 "ext/standard/var_unserializer.c"
-yy73:
+#line 1048 "ext/standard/var_unserializer.c"
+yy66:
yych = *++YYCURSOR;
if (yych <= ',') {
- if (yych == '+') goto yy88;
+ if (yych == '+') goto yy81;
goto yy18;
} else {
- if (yych <= '-') goto yy88;
+ if (yych <= '-') goto yy81;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy89;
+ if (yych <= '9') goto yy82;
goto yy18;
}
-yy74:
+yy67:
yych = *++YYCURSOR;
- if (yych == 'F') goto yy91;
+ if (yych == 'F') goto yy84;
goto yy18;
-yy75:
+yy68:
yych = *++YYCURSOR;
- if (yych == 'N') goto yy91;
+ if (yych == 'N') goto yy84;
goto yy18;
-yy76:
+yy69:
++YYCURSOR;
-#line 672 "ext/standard/var_unserializer.re"
+#line 713 "ext/standard/var_unserializer.re"
{
#if SIZEOF_ZEND_LONG == 4
int digits = YYCURSOR - start - 3;
@@ -1103,21 +1092,21 @@ yy76:
ZVAL_LONG(rval, parse_iv(start + 2));
return 1;
}
-#line 1107 "ext/standard/var_unserializer.c"
-yy78:
+#line 1096 "ext/standard/var_unserializer.c"
+yy71:
yych = *++YYCURSOR;
- if (yych == '"') goto yy92;
+ if (yych == '"') goto yy85;
goto yy18;
-yy79:
+yy72:
++YYCURSOR;
-#line 636 "ext/standard/var_unserializer.re"
+#line 677 "ext/standard/var_unserializer.re"
{
zend_long id;
*p = YYCURSOR;
if (!var_hash) return 0;
- id = parse_iv(start + 2) - 1;
+ id = parse_uiv(start + 2) - 1;
if (id == -1 || (rval_ref = var_access(var_hash, id)) == NULL) {
return 0;
}
@@ -1134,14 +1123,14 @@ yy79:
return 1;
}
-#line 1138 "ext/standard/var_unserializer.c"
-yy81:
+#line 1127 "ext/standard/var_unserializer.c"
+yy74:
yych = *++YYCURSOR;
- if (yych == '"') goto yy94;
+ if (yych == '"') goto yy87;
goto yy18;
-yy82:
+yy75:
++YYCURSOR;
-#line 824 "ext/standard/var_unserializer.re"
+#line 877 "ext/standard/var_unserializer.re"
{
size_t len, len2, len3, maxlen;
zend_long elements;
@@ -1293,10 +1282,10 @@ yy82:
return object_common2(UNSERIALIZE_PASSTHRU, elements);
}
-#line 1297 "ext/standard/var_unserializer.c"
-yy84:
+#line 1286 "ext/standard/var_unserializer.c"
+yy77:
++YYCURSOR;
-#line 755 "ext/standard/var_unserializer.re"
+#line 802 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
zend_string *str;
@@ -1330,10 +1319,10 @@ yy84:
ZVAL_STR(rval, str);
return 1;
}
-#line 1334 "ext/standard/var_unserializer.c"
-yy86:
+#line 1323 "ext/standard/var_unserializer.c"
+yy79:
++YYCURSOR;
-#line 789 "ext/standard/var_unserializer.re"
+#line 836 "ext/standard/var_unserializer.re"
{
zend_long elements = parse_iv(start + 2);
/* use iv() not uiv() in order to check data range */
@@ -1351,38 +1340,38 @@ yy86:
zend_hash_real_init(Z_ARRVAL_P(rval), 0);
}
+ /* The array may contain references to itself, in which case we'll be modifying an
+ * rc>1 array. This is okay, since the array is, ostensibly, only visible to
+ * unserialize (in practice unserialization handlers also see it). Ideally we should
+ * prohibit "r:" references to non-objects, as we only generate them for objects. */
+ HT_ALLOW_COW_VIOLATION(Z_ARRVAL_P(rval));
+
if (!process_nested_data(UNSERIALIZE_PASSTHRU, Z_ARRVAL_P(rval), elements, 0)) {
return 0;
}
return finish_nested_data(UNSERIALIZE_PASSTHRU);
}
-#line 1361 "ext/standard/var_unserializer.c"
-yy88:
+#line 1356 "ext/standard/var_unserializer.c"
+yy81:
yych = *++YYCURSOR;
- if (yych <= ',') {
- if (yych == '+') goto yy96;
- goto yy18;
- } else {
- if (yych <= '-') goto yy96;
- if (yych <= '/') goto yy18;
- if (yych >= ':') goto yy18;
- }
-yy89:
+ if (yych <= '/') goto yy18;
+ if (yych >= ':') goto yy18;
+yy82:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy89;
- if (yych == ';') goto yy71;
+ if (yych <= '9') goto yy82;
+ if (yych == ';') goto yy64;
goto yy18;
-yy91:
+yy84:
yych = *++YYCURSOR;
- if (yych == ';') goto yy97;
+ if (yych == ';') goto yy89;
goto yy18;
-yy92:
+yy85:
++YYCURSOR;
-#line 813 "ext/standard/var_unserializer.re"
+#line 866 "ext/standard/var_unserializer.re"
{
zend_long elements;
if (!var_hash) return 0;
@@ -1393,10 +1382,10 @@ yy92:
}
return object_common2(UNSERIALIZE_PASSTHRU, elements);
}
-#line 1397 "ext/standard/var_unserializer.c"
-yy94:
+#line 1386 "ext/standard/var_unserializer.c"
+yy87:
++YYCURSOR;
-#line 723 "ext/standard/var_unserializer.re"
+#line 764 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
char *str;
@@ -1425,36 +1414,37 @@ yy94:
YYCURSOR += 2;
*p = YYCURSOR;
- ZVAL_STRINGL(rval, str, len);
+ if (len == 0) {
+ ZVAL_EMPTY_STRING(rval);
+ } else if (len == 1) {
+ ZVAL_INTERNED_STR(rval, ZSTR_CHAR((zend_uchar)*str));
+ } else {
+ ZVAL_STRINGL(rval, str, len);
+ }
return 1;
}
-#line 1432 "ext/standard/var_unserializer.c"
-yy96:
- yych = *++YYCURSOR;
- if (yych <= '/') goto yy18;
- if (yych <= '9') goto yy89;
- goto yy18;
-yy97:
+#line 1427 "ext/standard/var_unserializer.c"
+yy89:
++YYCURSOR;
-#line 698 "ext/standard/var_unserializer.re"
+#line 739 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
if (!strncmp((char*)start + 2, "NAN", 3)) {
- ZVAL_DOUBLE(rval, php_get_nan());
+ ZVAL_DOUBLE(rval, ZEND_NAN);
} else if (!strncmp((char*)start + 2, "INF", 3)) {
- ZVAL_DOUBLE(rval, php_get_inf());
+ ZVAL_DOUBLE(rval, ZEND_INFINITY);
} else if (!strncmp((char*)start + 2, "-INF", 4)) {
- ZVAL_DOUBLE(rval, -php_get_inf());
+ ZVAL_DOUBLE(rval, -ZEND_INFINITY);
} else {
ZVAL_NULL(rval);
}
return 1;
}
-#line 1456 "ext/standard/var_unserializer.c"
+#line 1446 "ext/standard/var_unserializer.c"
}
-#line 984 "ext/standard/var_unserializer.re"
+#line 1037 "ext/standard/var_unserializer.re"
return 0;