summaryrefslogtreecommitdiff
path: root/Zend/zend_ini_scanner.l
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2008-09-11 00:33:38 +0000
committerStanislav Malyshev <stas@php.net>2008-09-11 00:33:38 +0000
commit193dd31a22a52cfdbd30135b1025ca774d1e98b4 (patch)
tree24f45f14967267abe978d8a3872a9f94cdfdf547 /Zend/zend_ini_scanner.l
parent66ec2ac6018b363ad510c8a35fa1313d4726060e (diff)
downloadphp-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.l21
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;
}