andrei Fri Dec 15 00:58:08 2006 UTC Modified files: (Branch: PHP_5_2) /php-src/ext/standard var_unserializer.c var_unserializer.re Log: Support for 'S' format in unserialize() (forward compatibility with PHP 6)
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/var_unserializer.c?r1=1.70.2.4&r2=1.70.2.4.2.1&diff_format=u Index: php-src/ext/standard/var_unserializer.c diff -u php-src/ext/standard/var_unserializer.c:1.70.2.4 php-src/ext/standard/var_unserializer.c:1.70.2.4.2.1 --- php-src/ext/standard/var_unserializer.c:1.70.2.4 Sun Jan 1 12:50:16 2006 +++ php-src/ext/standard/var_unserializer.c Fri Dec 15 00:58:08 2006 @@ -1,4 +1,4 @@ -/* Generated by re2c 0.9.11 on Sun Jan 1 14:39:32 2006 */ +/* Generated by re2c 0.9.12 on Thu Dec 14 15:59:31 2006 */ #line 1 "ext/standard/var_unserializer.re" /* +----------------------------------------------------------------------+ @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: var_unserializer.c,v 1.70.2.4 2006/01/01 12:50:16 sniper Exp $ */ +/* $Id: var_unserializer.c,v 1.70.2.4.2.1 2006/12/15 00:58:08 andrei Exp $ */ #include "php.h" #include "ext/standard/php_var.h" @@ -140,6 +140,38 @@ /* }}} */ +static char *unserialize_str(const unsigned char **p, int len) +{ + int i, j; + char *str = emalloc(len+1); + + for (i = 0; i < len; i++) { + if (**p != '\\') { + str[i] = (char)**p; + } else { + unsigned char ch = 0; + + for (j = 0; j < 2; 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(str); + return NULL; + } + } + str[i] = (char)ch; + } + (*p)++; + } + str[i] = 0; + return str; +} + #define YYFILL(n) do { } while (0) #define YYCTYPE unsigned char #define YYCURSOR cursor @@ -147,7 +179,7 @@ #define YYMARKER marker -#line 155 "ext/standard/var_unserializer.re" +#line 187 "ext/standard/var_unserializer.re" @@ -390,7 +422,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, }; -#line 394 "ext/standard/var_unserializer.c" +#line 426 "ext/standard/var_unserializer.c" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -400,105 +432,110 @@ 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 'S': 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 626 "ext/standard/var_unserializer.re" +#line 687 "ext/standard/var_unserializer.re" { return 0; } -#line 424 "ext/standard/var_unserializer.c" +#line 457 "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: yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if(yych == ':') goto yy17; goto yy3; -yy13: ++YYCURSOR; - goto yy14; -yy14: -#line 620 "ext/standard/var_unserializer.re" +yy14: ++YYCURSOR; + goto yy15; +yy15: +#line 681 "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 469 "ext/standard/var_unserializer.c" -yy15: yych = *++YYCURSOR; - goto yy3; +#line 506 "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 508 "ext/standard/var_unserializer.re" +yy23: ++YYCURSOR; + goto yy24; +yy24: +#line 569 "ext/standard/var_unserializer.re" { size_t len, len2, len3, maxlen; long elements; @@ -610,36 +647,36 @@ return object_common2(UNSERIALIZE_PASSTHRU, elements); } -#line 614 "ext/standard/var_unserializer.c" -yy24: yych = *++YYCURSOR; +#line 651 "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 500 "ext/standard/var_unserializer.re" +yy30: ++YYCURSOR; + goto yy31; +yy31: +#line 561 "ext/standard/var_unserializer.re" { INIT_PZVAL(*rval); @@ -647,31 +684,31 @@ return object_common2(UNSERIALIZE_PASSTHRU, object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR)); } -#line 651 "ext/standard/var_unserializer.c" -yy31: yych = *++YYCURSOR; - if(yych == '+') goto yy32; - if(yych <= '/') goto yy17; - if(yych <= '9') goto yy33; - goto yy17; +#line 688 "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 478 "ext/standard/var_unserializer.re" +yy37: ++YYCURSOR; + goto yy38; +yy38: +#line 539 "ext/standard/var_unserializer.re" { long elements = parse_iv(start + 2); /* use iv() not uiv() in order to check data range */ @@ -693,31 +730,84 @@ return finish_nested_data(UNSERIALIZE_PASSTHRU); } -#line 697 "ext/standard/var_unserializer.c" -yy38: yych = *++YYCURSOR; - if(yych == '+') goto yy39; - if(yych <= '/') goto yy17; - if(yych <= '9') goto yy40; - goto yy17; +#line 734 "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 450 "ext/standard/var_unserializer.re" +yy44: ++YYCURSOR; + goto yy45; +yy45: +#line 510 "ext/standard/var_unserializer.re" +{ + size_t len, maxlen; + char *str; + + len = parse_uiv(start + 2); + maxlen = max - YYCURSOR; + if (maxlen < len) { + *p = start + 2; + return 0; + } + + if ((str = unserialize_str(&YYCURSOR, len)) == NULL) { + return 0; + } + + if (*(YYCURSOR) != '"') { + efree(str); + *p = YYCURSOR; + return 0; + } + + YYCURSOR += 2; + *p = YYCURSOR; + + INIT_PZVAL(*rval); + ZVAL_STRINGL(*rval, str, len, 0); + return 1; +} +#line 787 "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 482 "ext/standard/var_unserializer.re" { size_t len, maxlen; char *str; @@ -745,163 +835,163 @@ ZVAL_STRINGL(*rval, str, len, 1); return 1; } -#line 749 "ext/standard/var_unserializer.c" -yy45: yych = *++YYCURSOR; +#line 839 "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 443 "ext/standard/var_unserializer.re" +yy63: ++YYCURSOR; + goto yy64; +yy64: +#line 475 "ext/standard/var_unserializer.re" { *p = YYCURSOR; INIT_PZVAL(*rval); ZVAL_DOUBLE(*rval, zend_strtod((const char *)start + 2, NULL)); return 1; } -#line 845 "ext/standard/var_unserializer.c" -yy57: yych = *++YYCURSOR; +#line 935 "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 428 "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 460 "ext/standard/var_unserializer.re" { *p = YYCURSOR; INIT_PZVAL(*rval); @@ -916,98 +1006,98 @@ return 1; } -#line 920 "ext/standard/var_unserializer.c" -yy68: yych = *++YYCURSOR; - if(yych == 'N') goto yy65; - goto yy17; -yy69: yych = *++YYCURSOR; +#line 1010 "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 421 "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 453 "ext/standard/var_unserializer.re" { *p = YYCURSOR; INIT_PZVAL(*rval); ZVAL_LONG(*rval, parse_iv(start + 2)); return 1; } -#line 956 "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 414 "ext/standard/var_unserializer.re" +#line 1046 "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 446 "ext/standard/var_unserializer.re" { *p = YYCURSOR; INIT_PZVAL(*rval); ZVAL_BOOL(*rval, parse_iv(start + 2)); return 1; } -#line 974 "ext/standard/var_unserializer.c" -yy79: ++YYCURSOR; - goto yy80; -yy80: -#line 407 "ext/standard/var_unserializer.re" +#line 1064 "ext/standard/var_unserializer.c" +yy87: ++YYCURSOR; + goto yy88; +yy88: +#line 439 "ext/standard/var_unserializer.re" { *p = YYCURSOR; INIT_PZVAL(*rval); ZVAL_NULL(*rval); return 1; } -#line 985 "ext/standard/var_unserializer.c" -yy81: yych = *++YYCURSOR; +#line 1075 "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 384 "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 416 "ext/standard/var_unserializer.re" { long id; @@ -1030,33 +1120,33 @@ return 1; } -#line 1034 "ext/standard/var_unserializer.c" -yy87: yych = *++YYCURSOR; +#line 1124 "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 363 "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 395 "ext/standard/var_unserializer.re" { long id; @@ -1077,10 +1167,10 @@ return 1; } -#line 1081 "ext/standard/var_unserializer.c" +#line 1171 "ext/standard/var_unserializer.c" } } -#line 628 "ext/standard/var_unserializer.re" +#line 689 "ext/standard/var_unserializer.re" return 0; http://cvs.php.net/viewvc.cgi/php-src/ext/standard/var_unserializer.re?r1=1.52.2.2&r2=1.52.2.2.2.1&diff_format=u Index: php-src/ext/standard/var_unserializer.re diff -u php-src/ext/standard/var_unserializer.re:1.52.2.2 php-src/ext/standard/var_unserializer.re:1.52.2.2.2.1 --- php-src/ext/standard/var_unserializer.re:1.52.2.2 Sun Jan 1 12:26:08 2006 +++ php-src/ext/standard/var_unserializer.re Fri Dec 15 00:58:08 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: var_unserializer.re,v 1.52.2.2 2006/01/01 12:26:08 sniper Exp $ */ +/* $Id: var_unserializer.re,v 1.52.2.2.2.1 2006/12/15 00:58:08 andrei Exp $ */ #include "php.h" #include "ext/standard/php_var.h" @@ -138,6 +138,38 @@ /* }}} */ +static char *unserialize_str(const unsigned char **p, int len) +{ + int i, j; + char *str = emalloc(len+1); + + for (i = 0; i < len; i++) { + if (**p != '\\') { + str[i] = (char)**p; + } else { + unsigned char ch = 0; + + for (j = 0; j < 2; 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(str); + return NULL; + } + } + str[i] = (char)ch; + } + (*p)++; + } + str[i] = 0; + return str; +} + #define YYFILL(n) do { } while (0) #define YYCTYPE unsigned char #define YYCURSOR cursor @@ -475,6 +507,35 @@ return 1; } +"S:" uiv ":" ["] { + size_t len, maxlen; + char *str; + + len = parse_uiv(start + 2); + maxlen = max - YYCURSOR; + if (maxlen < len) { + *p = start + 2; + return 0; + } + + if ((str = unserialize_str(&YYCURSOR, len)) == NULL) { + return 0; + } + + if (*(YYCURSOR) != '"') { + efree(str); + *p = YYCURSOR; + return 0; + } + + YYCURSOR += 2; + *p = YYCURSOR; + + INIT_PZVAL(*rval); + ZVAL_STRINGL(*rval, str, len, 0); + return 1; +} + "a:" uiv ":" "{" { long elements = parse_iv(start + 2); /* use iv() not uiv() in order to check data range */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php