diff options
| author | Stanislav Malyshev <stas@php.net> | 2008-09-11 00:33:38 +0000 |
|---|---|---|
| committer | Stanislav Malyshev <stas@php.net> | 2008-09-11 00:33:38 +0000 |
| commit | 193dd31a22a52cfdbd30135b1025ca774d1e98b4 (patch) | |
| tree | 24f45f14967267abe978d8a3872a9f94cdfdf547 /Zend/zend_ini_scanner.l | |
| parent | 66ec2ac6018b363ad510c8a35fa1313d4726060e (diff) | |
| download | php-git-193dd31a22a52cfdbd30135b1025ca774d1e98b4.tar.gz | |
Fix BC issue with ini scanner.
# Now in "": \LETTER is literal, \" is escaped ", value ending with \" is literal
Diffstat (limited to 'Zend/zend_ini_scanner.l')
| -rw-r--r-- | Zend/zend_ini_scanner.l | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l index 742bbe2b24..d901522ca6 100644 --- a/Zend/zend_ini_scanner.l +++ b/Zend/zend_ini_scanner.l @@ -244,21 +244,10 @@ static void zend_ini_escape_string(zval *lval, char *str, int len, char quote_ty if (*s == '\\') { s++; if (s >= end) { + *t++ = '\\'; continue; } switch (*s) { - case 'n': - *t++ = '\n'; - Z_STRLEN_P(lval)--; - break; - case 'r': - *t++ = '\r'; - Z_STRLEN_P(lval)--; - break; - case 't': - *t++ = '\t'; - Z_STRLEN_P(lval)--; - break; case '"': if (*s != quote_type) { *t++ = '\\'; @@ -324,7 +313,7 @@ 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 ([^$"\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR}) +DOUBLE_QUOTES_CHARS ([^$"\\]|("\\"[^"])|{LITERAL_DOLLAR}|"\\"["][^\r\n]) <!*> := yyleng = YYCURSOR - SCNG(yy_text); @@ -457,7 +446,11 @@ DOUBLE_QUOTES_CHARS ([^$"\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR}) return '"'; } -<ST_DOUBLE_QUOTES>{DOUBLE_QUOTES_CHARS}+ { /* Escape double quoted string contents */ +<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; } |
