From dd7b767d7f6cc06c8d68c9c0fbb494559d9c1ea4 Mon Sep 17 00:00:00 2001 From: Jani Taskinen Date: Fri, 7 Aug 2009 14:21:38 +0000 Subject: [PATCH] - Fixed bug #48660 (parse_ini_*(): dollar sign as last character of value fails) --- Zend/zend_ini_scanner.l | 50 +++++++++++++++---- .../tests/general_functions/bug48660.phpt | 44 ++++++++-------- 2 files changed, 61 insertions(+), 33 deletions(-) diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l index b3143a14ad..17be4b0ffa 100644 --- a/Zend/zend_ini_scanner.l +++ b/Zend/zend_ini_scanner.l @@ -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 '"'; } -{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; -} - ["]{TABS_AND_SPACES}* { /* Double quoted '"' string ends */ yy_pop_state(TSRMLS_C); return '"'; } +[^] { /* 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; +} + {WHITESPACE} { RETURN_TOKEN(TC_WHITESPACE, yytext, yyleng); } diff --git a/ext/standard/tests/general_functions/bug48660.phpt b/ext/standard/tests/general_functions/bug48660.phpt index 4c1492a18d..c3df1e888f 100644 --- a/ext/standard/tests/general_functions/bug48660.phpt +++ b/ext/standard/tests/general_functions/bug48660.phpt @@ -27,32 +27,32 @@ var_dump(parse_ini_file($ini_location, true, INI_SCANNER_NORMAL)); --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" } } -- 2.50.1