]> granicus.if.org Git - php/commitdiff
Bugfix #27646: Cannot serialize/unserialize non-finite numeric values
authorMarcus Boerger <helly@php.net>
Tue, 23 Mar 2004 20:54:00 +0000 (20:54 +0000)
committerMarcus Boerger <helly@php.net>
Tue, 23 Mar 2004 20:54:00 +0000 (20:54 +0000)
ext/standard/var_unserializer.c
ext/standard/var_unserializer.re

index 97982c3a04040fae6420ab4bbe8d92f51a0fc970..f9da74d4c37fbd45d53a27712387ba77775fc53d 100644 (file)
@@ -1,6 +1,6 @@
-/* Generated by re2c 0.5 on Tue Feb  3 16:01:43 2004 */
-#line 1 "var_unserializer.re"
-/* 
+/* Generated by re2c 0.9.2 on Tue Mar 23 21:48:54 2004 */
+#line 1 "/usr/src/php5/ext/standard/var_unserializer.re"
+/*
   +----------------------------------------------------------------------+
   | PHP Version 5                                                        |
   +----------------------------------------------------------------------+
@@ -111,7 +111,7 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx)
 #define YYMARKER marker
 
 
-#line 118
+#line 118 "/usr/src/php5/ext/standard/var_unserializer.re"
 
 
 
@@ -252,6 +252,8 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
 
        
        
+
+#line 7 "re2c-output.c"
 {
        YYCTYPE yych;
        unsigned int yyaccept;
@@ -292,7 +294,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
        goto yy0;
 yy1:   ++YYCURSOR;
 yy0:
-       if((YYLIMIT - YYCURSOR) < 5) YYFILL(5);
+       if((YYLIMIT - YYCURSOR) < 6) YYFILL(6);
        yych = *YYCURSOR;
        if(yych <= 'd'){
                if(yych <= 'R'){
@@ -331,6 +333,7 @@ yy0:
                        } else {
                                if(yych <= '}') goto yy14;
                                if(yych <= '\277')      goto yy16;
+                               goto yy2;
                        }
                }
        }
@@ -340,24 +343,26 @@ yy2:      YYCURSOR = YYMARKER;
        }
 yy3:   yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
-       if(yych == ':') goto yy81;
+       if(yych == ':') goto yy86;
+       goto yy4;
 yy4:
-#line 461
-       { return 0; }
+#line 461 "/usr/src/php5/ext/standard/var_unserializer.re"
+{ return 0; }
+#line 102 "re2c-output.c"
 yy5:   yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
-       if(yych == ':') goto yy75;
+       if(yych == ':') goto yy80;
        goto yy4;
 yy6:   yych = *++YYCURSOR;
-       if(yych == ';') goto yy73;
+       if(yych == ';') goto yy78;
        goto yy4;
 yy7:   yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
-       if(yych == ':') goto yy67;
+       if(yych == ':') goto yy72;
        goto yy4;
 yy8:   yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
-       if(yych == ':') goto yy61;
+       if(yych == ':') goto yy66;
        goto yy4;
 yy9:   yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -380,32 +385,39 @@ yy13:     yyaccept = 0;
        if(yych == ':') goto yy17;
        goto yy4;
 yy14:  yych = *++YYCURSOR;
+       goto yy15;
 yy15:
-#line 455
-       {
+#line 455 "/usr/src/php5/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 147 "re2c-output.c"
 yy16:  yych = *++YYCURSOR;
        goto yy4;
 yy17:  yych = *++YYCURSOR;
        if(yybm[0+yych] & 128)  goto yy19;
        if(yych != '+') goto yy2;
+       goto yy18;
 yy18:  yych = *++YYCURSOR;
        if(yybm[0+yych] & 128)  goto yy19;
        goto yy2;
 yy19:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
+       goto yy20;
 yy20:  if(yybm[0+yych] & 128)  goto yy19;
        if(yych != ':') goto yy2;
+       goto yy21;
 yy21:  yych = *++YYCURSOR;
        if(yych != '"') goto yy2;
+       goto yy22;
 yy22:  yych = *++YYCURSOR;
+       goto yy23;
 yy23:
-#line 376
-       {
+#line 376 "/usr/src/php5/ext/standard/var_unserializer.re"
+{
        int len;
        int elements;
        int len2;
@@ -483,9 +495,11 @@ yy23:
 
        return object_common2(UNSERIALIZE_PASSTHRU, elements);
 }
+#line 249 "re2c-output.c"
 yy24:  yych = *++YYCURSOR;
        if(yych <= ','){
                if(yych != '+') goto yy2;
+               goto yy25;
        } else {
                if(yych <= '-') goto yy25;
                if(yych <= '/') goto yy2;
@@ -495,24 +509,30 @@ yy24:     yych = *++YYCURSOR;
 yy25:  yych = *++YYCURSOR;
        if(yych <= '/') goto yy2;
        if(yych >= ':') goto yy2;
+       goto yy26;
 yy26:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
+       goto yy27;
 yy27:  if(yych <= '/') goto yy2;
        if(yych <= '9') goto yy26;
        if(yych >= ';') goto yy2;
+       goto yy28;
 yy28:  yych = *++YYCURSOR;
        if(yych != '"') goto yy2;
+       goto yy29;
 yy29:  yych = *++YYCURSOR;
+       goto yy30;
 yy30:
-#line 368
-       {
+#line 368 "/usr/src/php5/ext/standard/var_unserializer.re"
+{
 
        INIT_PZVAL(*rval);
        
        return object_common2(UNSERIALIZE_PASSTHRU,
                        object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR));
 }
+#line 286 "re2c-output.c"
 yy31:  yych = *++YYCURSOR;
        if(yych == '+') goto yy32;
        if(yych <= '/') goto yy2;
@@ -521,18 +541,23 @@ yy31:     yych = *++YYCURSOR;
 yy32:  yych = *++YYCURSOR;
        if(yych <= '/') goto yy2;
        if(yych >= ':') goto yy2;
+       goto yy33;
 yy33:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
+       goto yy34;
 yy34:  if(yych <= '/') goto yy2;
        if(yych <= '9') goto yy33;
        if(yych >= ';') goto yy2;
+       goto yy35;
 yy35:  yych = *++YYCURSOR;
        if(yych != '{') goto yy2;
+       goto yy36;
 yy36:  yych = *++YYCURSOR;
+       goto yy37;
 yy37:
-#line 350
-       {
+#line 350 "/usr/src/php5/ext/standard/var_unserializer.re"
+{
        int elements = parse_iv(start + 2);
 
        *p = YYCURSOR;
@@ -549,6 +574,7 @@ yy37:
 
        return finish_nested_data(UNSERIALIZE_PASSTHRU);
 }
+#line 328 "re2c-output.c"
 yy38:  yych = *++YYCURSOR;
        if(yych == '+') goto yy39;
        if(yych <= '/') goto yy2;
@@ -557,18 +583,23 @@ yy38:     yych = *++YYCURSOR;
 yy39:  yych = *++YYCURSOR;
        if(yych <= '/') goto yy2;
        if(yych >= ':') goto yy2;
+       goto yy40;
 yy40:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
+       goto yy41;
 yy41:  if(yych <= '/') goto yy2;
        if(yych <= '9') goto yy40;
        if(yych >= ';') goto yy2;
+       goto yy42;
 yy42:  yych = *++YYCURSOR;
        if(yych != '"') goto yy2;
+       goto yy43;
 yy43:  yych = *++YYCURSOR;
+       goto yy44;
 yy44:
-#line 330
-       {
+#line 330 "/usr/src/php5/ext/standard/var_unserializer.re"
+{
        int len;
        char *str;
 
@@ -587,27 +618,40 @@ yy44:
        ZVAL_STRINGL(*rval, str, len, 0);
        return 1;
 }
+#line 372 "re2c-output.c"
 yy45:  yych = *++YYCURSOR;
-       if(yych <= '-'){
-               if(yych == '+') goto yy46;
-               if(yych <= ',') goto yy2;
+       if(yych <= '/'){
+               if(yych <= ','){
+                       if(yych != '+') goto yy2;
+                       goto yy46;
+               } else {
+                       if(yych <= '-') goto yy46;
+                       if(yych <= '.') goto yy49;
+                       goto yy2;
+               }
        } else {
-               if(yych <= '.') goto yy49;
-               if(yych <= '/') goto yy2;
-               if(yych <= '9') goto yy47;
-               goto yy2;
+               if(yych <= 'I'){
+                       if(yych <= '9') goto yy47;
+                       if(yych <= 'H') goto yy2;
+                       goto yy51;
+               } else {
+                       if(yych == 'N') goto yy50;
+                       goto yy2;
+               }
        }
 yy46:  yych = *++YYCURSOR;
        if(yych == '.') goto yy49;
        if(yych <= '/') goto yy2;
        if(yych >= ':') goto yy2;
+       goto yy47;
 yy47:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
+       goto yy48;
 yy48:  if(yych <= ':'){
                if(yych <= '.'){
                        if(yych <= '-') goto yy2;
-                       goto yy59;
+                       goto yy64;
                } else {
                        if(yych <= '/') goto yy2;
                        if(yych <= '9') goto yy47;
@@ -615,173 +659,216 @@ yy48:   if(yych <= ':'){
                }
        } else {
                if(yych <= 'E'){
-                       if(yych <= ';') goto yy52;
+                       if(yych <= ';') goto yy54;
                        if(yych <= 'D') goto yy2;
-                       goto yy54;
+                       goto yy59;
                } else {
-                       if(yych == 'e') goto yy54;
+                       if(yych == 'e') goto yy59;
                        goto yy2;
                }
        }
 yy49:  yych = *++YYCURSOR;
        if(yych <= '/') goto yy2;
-       if(yych >= ':') goto yy2;
-yy50:  ++YYCURSOR;
+       if(yych <= '9') goto yy57;
+       goto yy2;
+yy50:  yych = *++YYCURSOR;
+       if(yych == 'A') goto yy56;
+       goto yy2;
+yy51:  yych = *++YYCURSOR;
+       if(yych != 'N') goto yy2;
+       goto yy52;
+yy52:  yych = *++YYCURSOR;
+       if(yych != 'F') goto yy2;
+       goto yy53;
+yy53:  yych = *++YYCURSOR;
+       if(yych != ';') goto yy2;
+       goto yy54;
+yy54:  yych = *++YYCURSOR;
+       goto yy55;
+yy55:
+#line 323 "/usr/src/php5/ext/standard/var_unserializer.re"
+{
+       *p = YYCURSOR;
+       INIT_PZVAL(*rval);
+       ZVAL_DOUBLE(*rval, atof(start + 2));
+       return 1;
+}
+#line 447 "re2c-output.c"
+yy56:  yych = *++YYCURSOR;
+       if(yych == 'N') goto yy53;
+       goto yy2;
+yy57:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-yy51:  if(yych <= ';'){
+       goto yy58;
+yy58:  if(yych <= ';'){
                if(yych <= '/') goto yy2;
-               if(yych <= '9') goto yy50;
+               if(yych <= '9') goto yy57;
                if(yych <= ':') goto yy2;
+               goto yy54;
        } else {
                if(yych <= 'E'){
                        if(yych <= 'D') goto yy2;
-                       goto yy54;
+                       goto yy59;
                } else {
-                       if(yych == 'e') goto yy54;
-                       goto yy2;
+                       if(yych != 'e') goto yy2;
+                       goto yy59;
                }
        }
-yy52:  yych = *++YYCURSOR;
-yy53:
-#line 323
-       {
-       *p = YYCURSOR;
-       INIT_PZVAL(*rval);
-       ZVAL_DOUBLE(*rval, atof(start + 2));
-       return 1;
-}
-yy54:  yych = *++YYCURSOR;
+yy59:  yych = *++YYCURSOR;
        if(yych <= ','){
                if(yych != '+') goto yy2;
+               goto yy60;
        } else {
-               if(yych <= '-') goto yy55;
+               if(yych <= '-') goto yy60;
                if(yych <= '/') goto yy2;
-               if(yych <= '9') goto yy56;
+               if(yych <= '9') goto yy61;
                goto yy2;
        }
-yy55:  yych = *++YYCURSOR;
+yy60:  yych = *++YYCURSOR;
        if(yych <= ','){
-               if(yych == '+') goto yy58;
+               if(yych == '+') goto yy63;
                goto yy2;
        } else {
-               if(yych <= '-') goto yy58;
+               if(yych <= '-') goto yy63;
                if(yych <= '/') goto yy2;
                if(yych >= ':') goto yy2;
+               goto yy61;
        }
-yy56:  ++YYCURSOR;
+yy61:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-yy57:  if(yych <= '/') goto yy2;
-       if(yych <= '9') goto yy56;
-       if(yych == ';') goto yy52;
+       goto yy62;
+yy62:  if(yych <= '/') goto yy2;
+       if(yych <= '9') goto yy61;
+       if(yych == ';') goto yy54;
        goto yy2;
-yy58:  yych = *++YYCURSOR;
+yy63:  yych = *++YYCURSOR;
        if(yych <= '/') goto yy2;
-       if(yych <= '9') goto yy56;
+       if(yych <= '9') goto yy61;
        goto yy2;
-yy59:  ++YYCURSOR;
+yy64:  ++YYCURSOR;
        if((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
        yych = *YYCURSOR;
-yy60:  if(yych <= ';'){
+       goto yy65;
+yy65:  if(yych <= ';'){
                if(yych <= '/') goto yy2;
-               if(yych <= '9') goto yy59;
+               if(yych <= '9') goto yy64;
                if(yych <= ':') goto yy2;
-               goto yy52;
+               goto yy54;
        } else {
                if(yych <= 'E'){
                        if(yych <= 'D') goto yy2;
-                       goto yy54;
+                       goto yy59;
                } else {
-                       if(yych == 'e') goto yy54;
+                       if(yych == 'e') goto yy59;
                        goto yy2;
                }
        }
-yy61:  yych = *++YYCURSOR;
+yy66:  yych = *++YYCURSOR;
        if(yych <= ','){
                if(yych != '+') goto yy2;
+               goto yy67;
        } else {
-               if(yych <= '-') goto yy62;
+               if(yych <= '-') goto yy67;
                if(yych <= '/') goto yy2;
-               if(yych <= '9') goto yy63;
+               if(yych <= '9') goto yy68;
                goto yy2;
        }
-yy62:  yych = *++YYCURSOR;
+yy67:  yych = *++YYCURSOR;
        if(yych <= '/') goto yy2;
        if(yych >= ':') goto yy2;
-yy63:  ++YYCURSOR;
+       goto yy68;
+yy68:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-yy64:  if(yych <= '/') goto yy2;
-       if(yych <= '9') goto yy63;
+       goto yy69;
+yy69:  if(yych <= '/') goto yy2;
+       if(yych <= '9') goto yy68;
        if(yych != ';') goto yy2;
-yy65:  yych = *++YYCURSOR;
-yy66:
-#line 316
-       {
+       goto yy70;
+yy70:  yych = *++YYCURSOR;
+       goto yy71;
+yy71:
+#line 316 "/usr/src/php5/ext/standard/var_unserializer.re"
+{
        *p = YYCURSOR;
        INIT_PZVAL(*rval);
        ZVAL_LONG(*rval, parse_iv(start + 2));
        return 1;
 }
-yy67:  yych = *++YYCURSOR;
+#line 551 "re2c-output.c"
+yy72:  yych = *++YYCURSOR;
        if(yych <= ','){
                if(yych != '+') goto yy2;
+               goto yy73;
        } else {
-               if(yych <= '-') goto yy68;
+               if(yych <= '-') goto yy73;
                if(yych <= '/') goto yy2;
-               if(yych <= '9') goto yy69;
+               if(yych <= '9') goto yy74;
                goto yy2;
        }
-yy68:  yych = *++YYCURSOR;
+yy73:  yych = *++YYCURSOR;
        if(yych <= '/') goto yy2;
        if(yych >= ':') goto yy2;
-yy69:  ++YYCURSOR;
+       goto yy74;
+yy74:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-yy70:  if(yych <= '/') goto yy2;
-       if(yych <= '9') goto yy69;
+       goto yy75;
+yy75:  if(yych <= '/') goto yy2;
+       if(yych <= '9') goto yy74;
        if(yych != ';') goto yy2;
-yy71:  yych = *++YYCURSOR;
-yy72:
-#line 309
-       {
+       goto yy76;
+yy76:  yych = *++YYCURSOR;
+       goto yy77;
+yy77:
+#line 309 "/usr/src/php5/ext/standard/var_unserializer.re"
+{
        *p = YYCURSOR;
        INIT_PZVAL(*rval);
        ZVAL_BOOL(*rval, parse_iv(start + 2));
        return 1;
 }
-yy73:  yych = *++YYCURSOR;
-yy74:
-#line 302
-       {
+#line 584 "re2c-output.c"
+yy78:  yych = *++YYCURSOR;
+       goto yy79;
+yy79:
+#line 302 "/usr/src/php5/ext/standard/var_unserializer.re"
+{
        *p = YYCURSOR;
        INIT_PZVAL(*rval);
        ZVAL_NULL(*rval);
        return 1;
 }
-yy75:  yych = *++YYCURSOR;
+#line 595 "re2c-output.c"
+yy80:  yych = *++YYCURSOR;
        if(yych <= ','){
                if(yych != '+') goto yy2;
+               goto yy81;
        } else {
-               if(yych <= '-') goto yy76;
+               if(yych <= '-') goto yy81;
                if(yych <= '/') goto yy2;
-               if(yych <= '9') goto yy77;
+               if(yych <= '9') goto yy82;
                goto yy2;
        }
-yy76:  yych = *++YYCURSOR;
+yy81:  yych = *++YYCURSOR;
        if(yych <= '/') goto yy2;
        if(yych >= ':') goto yy2;
-yy77:  ++YYCURSOR;
+       goto yy82;
+yy82:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-yy78:  if(yych <= '/') goto yy2;
-       if(yych <= '9') goto yy77;
+       goto yy83;
+yy83:  if(yych <= '/') goto yy2;
+       if(yych <= '9') goto yy82;
        if(yych != ';') goto yy2;
-yy79:  yych = *++YYCURSOR;
-yy80:
-#line 281
-       {
+       goto yy84;
+yy84:  yych = *++YYCURSOR;
+       goto yy85;
+yy85:
+#line 281 "/usr/src/php5/ext/standard/var_unserializer.re"
+{
        int id;
 
        *p = YYCURSOR;
@@ -801,28 +888,34 @@ yy80:
        
        return 1;
 }
-yy81:  yych = *++YYCURSOR;
+#line 642 "re2c-output.c"
+yy86:  yych = *++YYCURSOR;
        if(yych <= ','){
                if(yych != '+') goto yy2;
+               goto yy87;
        } else {
-               if(yych <= '-') goto yy82;
+               if(yych <= '-') goto yy87;
                if(yych <= '/') goto yy2;
-               if(yych <= '9') goto yy83;
+               if(yych <= '9') goto yy88;
                goto yy2;
        }
-yy82:  yych = *++YYCURSOR;
+yy87:  yych = *++YYCURSOR;
        if(yych <= '/') goto yy2;
        if(yych >= ':') goto yy2;
-yy83:  ++YYCURSOR;
+       goto yy88;
+yy88:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-yy84:  if(yych <= '/') goto yy2;
-       if(yych <= '9') goto yy83;
+       goto yy89;
+yy89:  if(yych <= '/') goto yy2;
+       if(yych <= '9') goto yy88;
        if(yych != ';') goto yy2;
-yy85:  yych = *++YYCURSOR;
-yy86:
-#line 260
-       {
+       goto yy90;
+yy90:  yych = *++YYCURSOR;
+       goto yy91;
+yy91:
+#line 260 "/usr/src/php5/ext/standard/var_unserializer.re"
+{
        int id;
 
        *p = YYCURSOR;
@@ -842,8 +935,9 @@ yy86:
        
        return 1;
 }
+#line 689 "re2c-output.c"
 }
-#line 463
+#line 463 "/usr/src/php5/ext/standard/var_unserializer.re"
 
 
        return 0;
index 26bc774e3d8854594a99dc2264661a468ffd8360..8f53eca0b6698fe172cfb4c88823e2d006579c58 100644 (file)
@@ -320,7 +320,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
        return 1;
 }
 
-"d:" (iv | nv | nvexp) ";"     {
+"d:" (iv | nv | nvexp | "NAN" | "INF") ";"     {
        *p = YYCURSOR;
        INIT_PZVAL(*rval);
        ZVAL_DOUBLE(*rval, atof(start + 2));