summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean DuBois <sean@siobud.com>2016-03-12 21:15:54 -0600
committerAnatol Belski <ab@php.net>2016-03-15 07:02:40 +0100
commit68ebfc87ad4f3842cd680c32ab307344c8659ce3 (patch)
tree079ebc91cf5b126130fdb2564cd3ff3f4662ebc1
parent84651b32eb53a979a1496a05b45261f0916fa0e6 (diff)
downloadphp-git-68ebfc87ad4f3842cd680c32ab307344c8659ce3.tar.gz
Fix bug #71624, PHP_MODE_PROCESS_STDIN (CLI SAPI called with '-R') did not properly set $argi and $argn
-rw-r--r--sapi/cli/php_cli.c7
-rw-r--r--sapi/cli/tests/bug71624.phpt43
2 files changed, 46 insertions, 4 deletions
diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c
index 92f1f64bf4..5d789d2626 100644
--- a/sapi/cli/php_cli.c
+++ b/sapi/cli/php_cli.c
@@ -1018,16 +1018,15 @@ static int do_cli(int argc, char **argv) /* {{{ */
if (exec_begin && zend_eval_string_ex(exec_begin, NULL, "Command line begin code", 1) == FAILURE) {
exit_status=254;
}
- ZVAL_LONG(&argi, index);
- zend_hash_str_update(&EG(symbol_table), "argi", sizeof("argi")-1, &argi);
while (exit_status == SUCCESS && (input=php_stream_gets(s_in_process, NULL, 0)) != NULL) {
len = strlen(input);
while (len > 0 && len-- && (input[len]=='\n' || input[len]=='\r')) {
input[len] = '\0';
}
- ZVAL_STRINGL(&argn, input, len);
+ ZVAL_STRINGL(&argn, input, len + 1);
zend_hash_str_update(&EG(symbol_table), "argn", sizeof("argn")-1, &argn);
- Z_LVAL(argi) = ++index;
+ ZVAL_LONG(&argi, ++index);
+ zend_hash_str_update(&EG(symbol_table), "argi", sizeof("argi")-1, &argi);
if (exec_run) {
if (zend_eval_string_ex(exec_run, NULL, "Command line run code", 1) == FAILURE) {
exit_status=254;
diff --git a/sapi/cli/tests/bug71624.phpt b/sapi/cli/tests/bug71624.phpt
new file mode 100644
index 0000000000..aa4c69da12
--- /dev/null
+++ b/sapi/cli/tests/bug71624.phpt
@@ -0,0 +1,43 @@
+--TEST--
+Bug #61977 Test that -R properly sets argi and argn
+--SKIPIF--
+<?php
+include "skipif.inc";
+?>
+--FILE--
+<?php
+
+$php = getenv('TEST_PHP_EXECUTABLE');
+
+$filename_txt = dirname(__FILE__) . DIRECTORY_SEPARATOR . "bug71624.test.txt";
+
+$txt = 'foo
+test
+hello
+';
+
+file_put_contents($filename_txt, $txt);
+
+$test_args = ['$argi', '$argn'];
+foreach ($test_args as $test_arg) {
+ if (substr(PHP_OS, 0, 3) == 'WIN') {
+ var_dump(`type "$filename_txt" | "$php" -n -R "echo $test_arg . PHP_EOL;"`);
+ } else {
+ var_dump(`cat "$filename_txt" | "$php" -n -R 'echo $test_arg . PHP_EOL;'`);
+ }
+}
+
+@unlink($filename_txt);
+
+echo "Done\n";
+?>
+--EXPECT--
+string(6) "1
+2
+3
+"
+string(15) "foo
+test
+hello
+"
+Done