Merge branch 'PHP-5.4'

* PHP-5.4:
  Fixed bug #51094 (parse_ini_file() with INI_SCANNER_RAW cuts a value that includes a semi-colon)
This commit is contained in:
Pierrick Charron 2012-06-07 17:51:56 +02:00
commit 5b10a65617
2 changed files with 49 additions and 6 deletions

View file

@ -347,7 +347,7 @@ DOLLAR_CURLY "${"
SECTION_RAW_CHARS [^\]\n\r] SECTION_RAW_CHARS [^\]\n\r]
SINGLE_QUOTED_CHARS [^'] SINGLE_QUOTED_CHARS [^']
RAW_VALUE_CHARS [^\n\r;\000] RAW_VALUE_CHARS [^"\n\r;\000]
LITERAL_DOLLAR ("$"([^{\000]|("\\"{ANY_CHAR}))) LITERAL_DOLLAR ("$"([^{\000]|("\\"{ANY_CHAR})))
VALUE_CHARS ([^$= \t\n\r;&|~()!"'\000]|{LITERAL_DOLLAR}) VALUE_CHARS ([^$= \t\n\r;&|~()!"'\000]|{LITERAL_DOLLAR})
@ -445,12 +445,33 @@ SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR})
return '='; return '=';
} }
<ST_RAW>{RAW_VALUE_CHARS}+ { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */ <ST_RAW>["] {
/* Eat leading and trailing double quotes */ while (YYCURSOR < YYLIMIT) {
if (yytext[0] == '"' && yytext[yyleng - 1] == '"') { switch (*YYCURSOR++) {
SCNG(yy_text)++; case '\n':
yyleng = yyleng - 2; SCNG(lineno)++;
break;
case '\r':
if (*YYCURSOR != '\n') {
SCNG(lineno)++;
}
break;
case '"':
yyleng = YYCURSOR - SCNG(yy_text) - 2;
SCNG(yy_text)++;
RETURN_TOKEN(TC_RAW, yytext, yyleng);
case '\\':
if (YYCURSOR < YYLIMIT) {
YYCURSOR++;
}
break;
}
} }
yyleng = YYCURSOR - SCNG(yy_text);
RETURN_TOKEN(TC_RAW, yytext, yyleng);
}
<ST_RAW>{RAW_VALUE_CHARS}+ { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */
RETURN_TOKEN(TC_RAW, yytext, yyleng); RETURN_TOKEN(TC_RAW, yytext, yyleng);
} }

View file

@ -0,0 +1,22 @@
--TEST--
Fixed bug #51094 (parse_ini_file() with INI_SCANNER_RAW cuts a value that includes a semi-colon).
--FILE--
<?php
$ini = parse_ini_string('ini="ini;raw"', null, INI_SCANNER_RAW);
var_dump($ini['ini']);
$ini = parse_ini_string('ini="ini;raw', null, INI_SCANNER_RAW);
var_dump($ini['ini']);
$ini = parse_ini_string('ini=ini;raw', null, INI_SCANNER_RAW);
var_dump($ini['ini']);
$ini = parse_ini_string('ini=ini"raw', null, INI_SCANNER_RAW);
var_dump($ini['ini']);
$ini = parse_ini_string("ini=\r\niniraw", null, INI_SCANNER_RAW);
var_dump($ini['ini']);
--EXPECTF--
string(7) "ini;raw"
string(8) ""ini;raw"
string(3) "ini"
string(7) "ini"raw"
string(0) ""