summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierrick Charron <pierrick@php.net>2018-10-09 01:27:39 -0400
committerPierrick Charron <pierrick@php.net>2018-10-09 01:27:39 -0400
commit9b4594515a1b64d1ff3fe62a9b0b192df5898be2 (patch)
treeb99ff4b5bad0d9bb54aa330ac84c7629f6c35f24
parentca7ccd01e44cb24638b396f9c79d463f57a0194f (diff)
parent44d2c8c6ddb91663d2f84d621fde71eb3455d422 (diff)
downloadphp-git-9b4594515a1b64d1ff3fe62a9b0b192df5898be2.tar.gz
Merge branch 'PHP-7.3'
-rw-r--r--Zend/tests/bug76965.phpt36
-rw-r--r--Zend/zend_ini_scanner.c101
-rw-r--r--Zend/zend_ini_scanner.l25
3 files changed, 106 insertions, 56 deletions
diff --git a/Zend/tests/bug76965.phpt b/Zend/tests/bug76965.phpt
new file mode 100644
index 0000000000..1a8e7d2d35
--- /dev/null
+++ b/Zend/tests/bug76965.phpt
@@ -0,0 +1,36 @@
+--TEST--
+Bug #76965 (INI_SCANNER_RAW doesn't strip trailing whitespace)
+--FILE--
+<?php
+// the trailing whitespace is intentional
+$ini = <<<END
+1="foo"
+2="bar" ; comment
+3= baz
+4= "foo;bar"
+5= "foo" ; bar ; baz
+6= "foo;bar" ; baz
+7= foo"bar ; "ok
+END;
+
+var_dump(parse_ini_string($ini, false, INI_SCANNER_RAW));
+?>
+===DONE===
+--EXPECT--
+array(7) {
+ [1]=>
+ string(3) "foo"
+ [2]=>
+ string(3) "bar"
+ [3]=>
+ string(3) "baz"
+ [4]=>
+ string(7) "foo;bar"
+ [5]=>
+ string(3) "foo"
+ [6]=>
+ string(7) "foo;bar"
+ [7]=>
+ string(7) "foo"bar"
+}
+===DONE===
diff --git a/Zend/zend_ini_scanner.c b/Zend/zend_ini_scanner.c
index cbf2ede93a..9ffae6941d 100644
--- a/Zend/zend_ini_scanner.c
+++ b/Zend/zend_ini_scanner.c
@@ -538,7 +538,7 @@ yy6:
yy8:
YYDEBUG(8, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 627 "Zend/zend_ini_scanner.l"
+#line 634 "Zend/zend_ini_scanner.l"
{
/* eat whitespace */
goto restart;
@@ -550,7 +550,7 @@ yy9:
yy10:
YYDEBUG(10, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 632 "Zend/zend_ini_scanner.l"
+#line 639 "Zend/zend_ini_scanner.l"
{
SCNG(lineno)++;
return END_OF_LINE;
@@ -616,7 +616,7 @@ yy14:
++YYCURSOR;
YYDEBUG(15, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 555 "Zend/zend_ini_scanner.l"
+#line 562 "Zend/zend_ini_scanner.l"
{ /* Disallow these chars outside option values */
return yytext[0];
}
@@ -748,7 +748,7 @@ yy31:
yy32:
YYDEBUG(32, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 637 "Zend/zend_ini_scanner.l"
+#line 644 "Zend/zend_ini_scanner.l"
{ /* Comment */
BEGIN(INITIAL);
SCNG(lineno)++;
@@ -1134,7 +1134,7 @@ yy62:
yy63:
YYDEBUG(63, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 573 "Zend/zend_ini_scanner.l"
+#line 580 "Zend/zend_ini_scanner.l"
{ /* Get rest as section/offset value */
RETURN_TOKEN(TC_STRING, yytext, yyleng);
}
@@ -1178,7 +1178,7 @@ yy66:
yy67:
YYDEBUG(67, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 648 "Zend/zend_ini_scanner.l"
+#line 655 "Zend/zend_ini_scanner.l"
{
return 0;
}
@@ -1188,7 +1188,7 @@ yy68:
++YYCURSOR;
YYDEBUG(69, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 577 "Zend/zend_ini_scanner.l"
+#line 584 "Zend/zend_ini_scanner.l"
{ /* Double quoted '"' string start */
yy_push_state(ST_DOUBLE_QUOTES);
return '"';
@@ -1258,7 +1258,7 @@ yy73:
yy75:
YYDEBUG(75, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 551 "Zend/zend_ini_scanner.l"
+#line 558 "Zend/zend_ini_scanner.l"
{ /* Get number option value as string */
RETURN_TOKEN(TC_NUMBER, yytext, yyleng);
}
@@ -1295,7 +1295,7 @@ yy76:
yy78:
YYDEBUG(78, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 547 "Zend/zend_ini_scanner.l"
+#line 554 "Zend/zend_ini_scanner.l"
{ /* Get constant option value */
RETURN_TOKEN(TC_CONSTANT, yytext, yyleng);
}
@@ -1524,7 +1524,7 @@ yy97:
yy98:
YYDEBUG(98, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 573 "Zend/zend_ini_scanner.l"
+#line 580 "Zend/zend_ini_scanner.l"
{ /* Get rest as section/offset value */
RETURN_TOKEN(TC_STRING, yytext, yyleng);
}
@@ -1568,7 +1568,7 @@ yy101:
yy102:
YYDEBUG(102, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 648 "Zend/zend_ini_scanner.l"
+#line 655 "Zend/zend_ini_scanner.l"
{
return 0;
}
@@ -1578,7 +1578,7 @@ yy103:
++YYCURSOR;
YYDEBUG(104, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 577 "Zend/zend_ini_scanner.l"
+#line 584 "Zend/zend_ini_scanner.l"
{ /* Double quoted '"' string start */
yy_push_state(ST_DOUBLE_QUOTES);
return '"';
@@ -1648,7 +1648,7 @@ yy108:
yy110:
YYDEBUG(110, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 551 "Zend/zend_ini_scanner.l"
+#line 558 "Zend/zend_ini_scanner.l"
{ /* Get number option value as string */
RETURN_TOKEN(TC_NUMBER, yytext, yyleng);
}
@@ -1685,7 +1685,7 @@ yy111:
yy113:
YYDEBUG(113, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 547 "Zend/zend_ini_scanner.l"
+#line 554 "Zend/zend_ini_scanner.l"
{ /* Get constant option value */
RETURN_TOKEN(TC_CONSTANT, yytext, yyleng);
}
@@ -1972,7 +1972,7 @@ yy134:
yy135:
YYDEBUG(135, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 643 "Zend/zend_ini_scanner.l"
+#line 650 "Zend/zend_ini_scanner.l"
{ /* End of option value (if EOF is reached before EOL */
BEGIN(INITIAL);
return END_OF_LINE;
@@ -1994,7 +1994,7 @@ yy137:
yy138:
YYDEBUG(138, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 569 "Zend/zend_ini_scanner.l"
+#line 576 "Zend/zend_ini_scanner.l"
{ /* Get everything else as option/offset value */
RETURN_TOKEN(TC_STRING, yytext, yyleng);
}
@@ -2022,7 +2022,7 @@ yy139:
yy141:
YYDEBUG(141, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 623 "Zend/zend_ini_scanner.l"
+#line 630 "Zend/zend_ini_scanner.l"
{
RETURN_TOKEN(TC_WHITESPACE, yytext, yyleng);
}
@@ -2033,7 +2033,7 @@ yy142:
yy143:
YYDEBUG(143, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 541 "Zend/zend_ini_scanner.l"
+#line 548 "Zend/zend_ini_scanner.l"
{ /* End of option value */
BEGIN(INITIAL);
SCNG(lineno)++;
@@ -2055,7 +2055,7 @@ yy145:
if (yych == ' ') goto yy145;
YYDEBUG(147, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 559 "Zend/zend_ini_scanner.l"
+#line 566 "Zend/zend_ini_scanner.l"
{ /* Boolean operators */
return yytext[0];
}
@@ -2065,7 +2065,7 @@ yy148:
++YYCURSOR;
YYDEBUG(149, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 577 "Zend/zend_ini_scanner.l"
+#line 584 "Zend/zend_ini_scanner.l"
{ /* Double quoted '"' string start */
yy_push_state(ST_DOUBLE_QUOTES);
return '"';
@@ -2144,7 +2144,7 @@ yy153:
yy155:
YYDEBUG(155, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 551 "Zend/zend_ini_scanner.l"
+#line 558 "Zend/zend_ini_scanner.l"
{ /* Get number option value as string */
RETURN_TOKEN(TC_NUMBER, yytext, yyleng);
}
@@ -2165,7 +2165,7 @@ yy158:
++YYCURSOR;
YYDEBUG(159, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 563 "Zend/zend_ini_scanner.l"
+#line 570 "Zend/zend_ini_scanner.l"
{ /* Make = used in option value to trigger error */
yyless(0);
BEGIN(INITIAL);
@@ -2218,7 +2218,7 @@ yy160:
yy162:
YYDEBUG(162, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 547 "Zend/zend_ini_scanner.l"
+#line 554 "Zend/zend_ini_scanner.l"
{ /* Get constant option value */
RETURN_TOKEN(TC_CONSTANT, yytext, yyleng);
}
@@ -2627,7 +2627,7 @@ yy177:
yy178:
YYDEBUG(178, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 637 "Zend/zend_ini_scanner.l"
+#line 644 "Zend/zend_ini_scanner.l"
{ /* Comment */
BEGIN(INITIAL);
SCNG(lineno)++;
@@ -3414,7 +3414,7 @@ yy208:
}
YYDEBUG(210, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 537 "Zend/zend_ini_scanner.l"
+#line 544 "Zend/zend_ini_scanner.l"
{ /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */
RETURN_TOKEN(TC_RAW, yytext, yyleng);
}
@@ -3424,7 +3424,7 @@ yy211:
++YYCURSOR;
YYDEBUG(212, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 648 "Zend/zend_ini_scanner.l"
+#line 655 "Zend/zend_ini_scanner.l"
{
return 0;
}
@@ -3508,7 +3508,7 @@ yyc_ST_DOUBLE_QUOTES:
yy221:
YYDEBUG(221, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 587 "Zend/zend_ini_scanner.l"
+#line 594 "Zend/zend_ini_scanner.l"
{ /* Escape double quoted string contents */
if (YYCURSOR > YYLIMIT) {
return 0;
@@ -3556,7 +3556,7 @@ yy222:
}
YYDEBUG(224, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 582 "Zend/zend_ini_scanner.l"
+#line 589 "Zend/zend_ini_scanner.l"
{ /* Double quoted '"' string ends */
yy_pop_state();
return '"';
@@ -3649,7 +3649,7 @@ yy233:
++YYCURSOR;
YYDEBUG(234, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 648 "Zend/zend_ini_scanner.l"
+#line 655 "Zend/zend_ini_scanner.l"
{
return 0;
}
@@ -3728,7 +3728,7 @@ yyc_ST_RAW:
++YYCURSOR;
YYDEBUG(240, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 643 "Zend/zend_ini_scanner.l"
+#line 650 "Zend/zend_ini_scanner.l"
{ /* End of option value (if EOF is reached before EOL */
BEGIN(INITIAL);
return END_OF_LINE;
@@ -3743,6 +3743,7 @@ yy242:
#line 500 "Zend/zend_ini_scanner.l"
{ /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */
unsigned char *sc = NULL;
+ EAT_LEADING_WHITESPACE();
while (YYCURSOR < YYLIMIT) {
switch (*YYCURSOR) {
case '\n':
@@ -3753,31 +3754,37 @@ yy242:
if (sc == NULL) {
sc = YYCURSOR;
}
- /* no break */
+ YYCURSOR++;
+ break;
+ case '"':
+ if (yytext[0] == '"') {
+ sc = NULL;
+ }
+ YYCURSOR++;
+ break;
default:
YYCURSOR++;
break;
}
}
end_raw_value_chars:
- yyleng = YYCURSOR - SCNG(yy_text);
-
- /* Eat trailing semicolons */
- while (yytext[yyleng - 1] == ';') {
- yyleng--;
+ if (sc) {
+ yyleng = sc - SCNG(yy_text);
+ } else {
+ yyleng = YYCURSOR - SCNG(yy_text);
}
+ EAT_TRAILING_WHITESPACE();
+
/* Eat leading and trailing double quotes */
if (yyleng > 1 && yytext[0] == '"' && yytext[yyleng - 1] == '"') {
SCNG(yy_text)++;
yyleng = yyleng - 2;
- } else if (sc) {
- YYCURSOR = sc;
- yyleng = YYCURSOR - SCNG(yy_text);
}
+
RETURN_TOKEN(TC_RAW, yytext, yyleng);
}
-#line 3781 "Zend/zend_ini_scanner.c"
+#line 3788 "Zend/zend_ini_scanner.c"
yy243:
YYDEBUG(243, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3801,13 +3808,13 @@ yy244:
yy245:
YYDEBUG(245, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 541 "Zend/zend_ini_scanner.l"
+#line 548 "Zend/zend_ini_scanner.l"
{ /* End of option value */
BEGIN(INITIAL);
SCNG(lineno)++;
return END_OF_LINE;
}
-#line 3811 "Zend/zend_ini_scanner.c"
+#line 3818 "Zend/zend_ini_scanner.c"
yy246:
YYDEBUG(246, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3844,25 +3851,25 @@ yy250:
yy251:
YYDEBUG(251, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 627 "Zend/zend_ini_scanner.l"
+#line 634 "Zend/zend_ini_scanner.l"
{
/* eat whitespace */
goto restart;
}
-#line 3853 "Zend/zend_ini_scanner.c"
+#line 3860 "Zend/zend_ini_scanner.c"
yy252:
YYDEBUG(252, *YYCURSOR);
++YYCURSOR;
yy253:
YYDEBUG(253, *YYCURSOR);
yyleng = YYCURSOR - SCNG(yy_text);
-#line 637 "Zend/zend_ini_scanner.l"
+#line 644 "Zend/zend_ini_scanner.l"
{ /* Comment */
BEGIN(INITIAL);
SCNG(lineno)++;
return END_OF_LINE;
}
-#line 3866 "Zend/zend_ini_scanner.c"
+#line 3873 "Zend/zend_ini_scanner.c"
yy254:
YYDEBUG(254, *YYCURSOR);
yych = *++YYCURSOR;
@@ -3870,6 +3877,6 @@ yy254:
goto yy253;
}
}
-#line 652 "Zend/zend_ini_scanner.l"
+#line 659 "Zend/zend_ini_scanner.l"
}
diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l
index 1df110d50f..206afb2a70 100644
--- a/Zend/zend_ini_scanner.l
+++ b/Zend/zend_ini_scanner.l
@@ -499,6 +499,7 @@ SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR})
<ST_RAW>{RAW_VALUE_CHARS} { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */
unsigned char *sc = NULL;
+ EAT_LEADING_WHITESPACE();
while (YYCURSOR < YYLIMIT) {
switch (*YYCURSOR) {
case '\n':
@@ -509,28 +510,34 @@ SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR})
if (sc == NULL) {
sc = YYCURSOR;
}
- /* no break */
+ YYCURSOR++;
+ break;
+ case '"':
+ if (yytext[0] == '"') {
+ sc = NULL;
+ }
+ YYCURSOR++;
+ break;
default:
YYCURSOR++;
break;
}
}
end_raw_value_chars:
- yyleng = YYCURSOR - SCNG(yy_text);
-
- /* Eat trailing semicolons */
- while (yytext[yyleng - 1] == ';') {
- yyleng--;
+ if (sc) {
+ yyleng = sc - SCNG(yy_text);
+ } else {
+ yyleng = YYCURSOR - SCNG(yy_text);
}
+ EAT_TRAILING_WHITESPACE();
+
/* Eat leading and trailing double quotes */
if (yyleng > 1 && yytext[0] == '"' && yytext[yyleng - 1] == '"') {
SCNG(yy_text)++;
yyleng = yyleng - 2;
- } else if (sc) {
- YYCURSOR = sc;
- yyleng = YYCURSOR - SCNG(yy_text);
}
+
RETURN_TOKEN(TC_RAW, yytext, yyleng);
}