]> granicus.if.org Git - php/commitdiff
- Fixed bug #48660 (parse_ini_*(): dollar sign as last character of value fails)
authorJani Taskinen <jani@php.net>
Fri, 7 Aug 2009 14:21:38 +0000 (14:21 +0000)
committerJani Taskinen <jani@php.net>
Fri, 7 Aug 2009 14:21:38 +0000 (14:21 +0000)
Zend/zend_ini_scanner.l
ext/standard/tests/general_functions/bug48660.phpt

index b3143a14ade4a2af88653dbf7d3676854484a4e7..17be4b0ffa80575131703abc43a4306ba95ddec8 100644 (file)
@@ -54,7 +54,9 @@
 #define YYSTATE      YYGETCONDITION()
 #define yytext       ((char*)SCNG(yy_text))
 #define yyleng       SCNG(yy_leng)
-#define yyless(x)    YYCURSOR = yytext + x
+#define yyless(x)    do {      YYCURSOR = (unsigned char*)yytext + x; \
+                                                       yyleng   = (unsigned int)x; } while(0)
+
 /* #define yymore()     goto yymore_restart */
 
 /* perform sanity check. If this message is triggered you should
@@ -320,7 +322,6 @@ RAW_VALUE_CHARS [^\n\r;]
 LITERAL_DOLLAR ("$"([^{\000]|("\\"{ANY_CHAR})))
 VALUE_CHARS         ([^$= \t\n\r;&|~()!"'\000]|{LITERAL_DOLLAR})
 SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR})
-DOUBLE_QUOTES_CHARS ([^$"\\]|("\\"[^"])|{LITERAL_DOLLAR}|"\\"["][^\r\n])
 
 <!*> := yyleng = YYCURSOR - SCNG(yy_text);
 
@@ -453,20 +454,47 @@ DOUBLE_QUOTES_CHARS ([^$"\\]|("\\"[^"])|{LITERAL_DOLLAR}|"\\"["][^\r\n])
        return '"';
 }
 
-<ST_DOUBLE_QUOTES>{DOUBLE_QUOTES_CHARS}+("\\"["])? { /* Escape double quoted string contents */
-       if(yyleng > 1 && yytext[yyleng-1] == '"' && yytext[yyleng-2] == '\\') {
-               yyless(yyleng-1);
-               yyleng--;
-       }
-       zend_ini_escape_string(ini_lval, yytext, yyleng, '"' TSRMLS_CC);
-       return TC_QUOTED_STRING;
-}
-
 <ST_DOUBLE_QUOTES>["]{TABS_AND_SPACES}* { /* Double quoted '"' string ends */
        yy_pop_state(TSRMLS_C);
        return '"';
 }
 
+<ST_DOUBLE_QUOTES>[^] { /* Escape double quoted string contents */
+       if (YYCURSOR > YYLIMIT) {
+               return 0;
+       }
+       
+       while (YYCURSOR < YYLIMIT) {
+               switch (*YYCURSOR++) {
+                       case '"':
+                               if (YYCURSOR < YYLIMIT && YYCURSOR[-2] == '\\' && *YYCURSOR != '\r' && *YYCURSOR != '\n') {
+                                       continue;
+                               }
+                               break;
+                       case '$':
+                               if (*YYCURSOR == '{') {
+                                       break;
+                               }
+                               continue;
+                       case '\\':
+                               if (YYCURSOR < YYLIMIT && *YYCURSOR != '"') {
+                                       YYCURSOR++;
+                               }
+                               /* fall through */
+                       default:
+                               continue;
+               }
+               
+               YYCURSOR--;
+               break;
+       }
+
+       yyleng = YYCURSOR - SCNG(yy_text);
+       
+       zend_ini_escape_string(ini_lval, yytext, yyleng, '"' TSRMLS_CC);
+       return TC_QUOTED_STRING;
+}
+
 <ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{WHITESPACE} {
        RETURN_TOKEN(TC_WHITESPACE, yytext, yyleng);
 }
index 4c1492a18d43f1d7e9687a078617ae6654a972fb..c3df1e888fc51d75ff8103fef7e9241171bd0e9e 100644 (file)
@@ -27,32 +27,32 @@ var_dump(parse_ini_file($ini_location, true, INI_SCANNER_NORMAL));
 <?php @unlink(dirname(__FILE__) . '/bug48660.tmp'); ?>
 --EXPECTF--
 array(1) {
-  ["cases"]=>
+  [u"cases"]=>
   array(5) {
-    ["Case.a"]=>
-    string(6) "avalue"
-    ["Case.b"]=>
-    string(12) "$dollar_sign"
-    ["Case.c"]=>
-    string(12) "dollar_sign$"
-    ["Case.d"]=>
-    string(13) "$dollar_sign$"
-    ["Case.e"]=>
-    string(2) "10"
+    [u"Case.a"]=>
+    unicode(6) "avalue"
+    [u"Case.b"]=>
+    unicode(12) "$dollar_sign"
+    [u"Case.c"]=>
+    unicode(12) "dollar_sign$"
+    [u"Case.d"]=>
+    unicode(13) "$dollar_sign$"
+    [u"Case.e"]=>
+    unicode(2) "10"
   }
 }
 array(1) {
-  ["cases"]=>
+  [u"cases"]=>
   array(5) {
-    ["Case.a"]=>
-    string(6) "avalue"
-    ["Case.b"]=>
-    string(12) "$dollar_sign"
-    ["Case.c"]=>
-    string(12) "dollar_sign$"
-    ["Case.d"]=>
-    string(13) "$dollar_sign$"
-    ["Case.e"]=>
-    string(2) "10"
+    [u"Case.a"]=>
+    unicode(6) "avalue"
+    [u"Case.b"]=>
+    unicode(12) "$dollar_sign"
+    [u"Case.c"]=>
+    unicode(12) "dollar_sign$"
+    [u"Case.d"]=>
+    unicode(13) "$dollar_sign$"
+    [u"Case.e"]=>
+    unicode(2) "10"
   }
 }