summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-02-21 16:59:30 +0100
committerNikita Popov <nikita.ppv@gmail.com>2019-02-22 10:50:56 +0100
commit914c1ec1d4e65ac599762388df5a22696e2f968b (patch)
tree868efb1f7bef97318c7da07f390d4ce9cb5ad9e6
parent427ebce6295b296c1f18f6bd927bf3cd295be815 (diff)
downloadphp-git-914c1ec1d4e65ac599762388df5a22696e2f968b.tar.gz
Stricter validation for popen mode argument on Windows
Context: The ext/standard/tests/file/popen_pclose_error-win32.phpt test often fails under parallel testing, because the "is not recognized as an internal or external command" message doesn't actually have a guaranteed position in the output. While looking into this, I noticed that this test on Windows tests something very different (invalid comand) than on Linux (invalid mode). Here I'm adjusting the Windows popen implementation so it immediately fails on a `rw` mode, just like it does on Linux.
-rw-r--r--TSRM/tsrm_win32.c14
-rw-r--r--ext/standard/tests/file/popen_pclose_error-win32-debug.phpt61
-rw-r--r--ext/standard/tests/file/popen_pclose_error-win32.phpt57
-rw-r--r--ext/standard/tests/file/popen_pclose_error.phpt4
4 files changed, 9 insertions, 127 deletions
diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c
index 704d30e209..131523c253 100644
--- a/TSRM/tsrm_win32.c
+++ b/TSRM/tsrm_win32.c
@@ -468,17 +468,17 @@ TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd,
return NULL;
}
- /*The following two checks can be removed once we drop XP support */
type_len = (int)strlen(type);
- if (type_len <1 || type_len > 2) {
+ if (type_len < 1 || type_len > 2) {
return NULL;
}
- for (i=0; i < type_len; i++) {
- if (!(*ptype == 'r' || *ptype == 'w' || *ptype == 'b' || *ptype == 't')) {
- return NULL;
- }
- ptype++;
+ if (ptype[0] != 'r' && ptype[0] != 'w') {
+ return NULL;
+ }
+
+ if (type_len > 1 && (ptype[1] != 'b' && ptype[1] != 't')) {
+ return NULL;
}
cmd = (char*)malloc(strlen(command)+strlen(TWG(comspec))+sizeof(" /c ")+2);
diff --git a/ext/standard/tests/file/popen_pclose_error-win32-debug.phpt b/ext/standard/tests/file/popen_pclose_error-win32-debug.phpt
deleted file mode 100644
index f786021231..0000000000
--- a/ext/standard/tests/file/popen_pclose_error-win32-debug.phpt
+++ /dev/null
@@ -1,61 +0,0 @@
---TEST--
-Test popen() and pclose function: error conditions
---SKIPIF--
-<?php
-if(substr(PHP_OS, 0, 3) != 'WIN' && PHP_DEBUG) die("skip Valid only on Windows");
-if(!PHP_DEBUG) die("skip Not Valid for release builds");
-
-ob_start();phpinfo(INFO_GENERAL);$inf=ob_get_contents(); ob_end_clean();
-if (!(strpos($inf, 'MSVC9') || strpos($inf, 'MSVC8'))) die("skip Not Valid for build done with VC < 8");
-?>
---FILE--
-<?php
-/*
- * Prototype: resource popen ( string command, string mode )
- * Description: Opens process file pointer.
-
- * Prototype: int pclose ( resource handle );
- * Description: Closes process file pointer.
- */
-$file_path = dirname(__FILE__);
-echo "*** Testing for error conditions ***\n";
-var_dump( popen() ); // Zero Arguments
-var_dump( popen("abc.txt") ); // Single Argument
-var_dump( popen("abc.txt", "rw") ); // Invalid mode Argument
-var_dump( pclose() );
-$file_handle = fopen($file_path."/popen.tmp", "w");
-var_dump( pclose($file_handle, $file_handle) );
-pclose($file_handle);
-var_dump( pclose(1) );
-echo "\n--- Done ---";
-?>
---CLEAN--
-<?php
-$file_path = dirname(__FILE__);
-unlink($file_path."/popen.tmp");
-?>
---EXPECTF--
-*** Testing for error conditions ***
-
-Warning: popen() expects exactly 2 parameters, 0 given in %s on line %d
-NULL
-
-Warning: popen() expects exactly 2 parameters, 1 given in %s on line %d
-NULL
-
-Warning: Invalid parameter detected in CRT function '_fdopen' (%s:%d) in %s on line %d
-
-Warning: popen(abc.txt,rw): Invalid argument in %s on line %d
-bool(false)
-
-Warning: pclose() expects exactly 1 parameter, 0 given in %s on line %d
-bool(false)
-
-Warning: pclose() expects exactly 1 parameter, 2 given in %s on line %d
-bool(false)
-
-Warning: pclose() expects parameter 1 to be resource, int given in %s on line %d
-bool(false)
-
---- Done ---'abc.txt' is not recognized as an internal or external command,
-operable program or batch file.
diff --git a/ext/standard/tests/file/popen_pclose_error-win32.phpt b/ext/standard/tests/file/popen_pclose_error-win32.phpt
deleted file mode 100644
index 0b29f9eefb..0000000000
--- a/ext/standard/tests/file/popen_pclose_error-win32.phpt
+++ /dev/null
@@ -1,57 +0,0 @@
---TEST--
-Test popen() and pclose function: error conditions
---SKIPIF--
-<?php
-if (substr(PHP_OS, 0, 3) != 'WIN') die("skip Valid only on Windows");
-if (PHP_DEBUG) die("skip Not Valid for debug builds");
-?>
---FILE--
-<?php
-/*
- * Prototype: resource popen ( string command, string mode )
- * Description: Opens process file pointer.
-
- * Prototype: int pclose ( resource handle );
- * Description: Closes process file pointer.
- */
-$file_path = dirname(__FILE__);
-echo "*** Testing for error conditions ***" . PHP_EOL;
-var_dump( popen() ); // Zero Arguments
-var_dump( popen("abc.txt") ); // Single Argument
-var_dump( popen("abc.txt", "rw") ); // Invalid mode Argument
-var_dump( pclose() );
-$file_handle = fopen($file_path."/popen.tmp", "w");
-var_dump( pclose($file_handle, $file_handle) );
-pclose($file_handle);
-var_dump( pclose(1) );
-echo PHP_EOL . PHP_EOL . "--- Done ---";
-?>
---CLEAN--
-<?php
-$file_path = dirname(__FILE__);
-unlink($file_path."/popen.tmp");
-?>
---EXPECTF--
-*** Testing for error conditions ***
-
-Warning: popen() expects exactly 2 parameters, 0 given in %s on line %d
-NULL
-
-Warning: popen() expects exactly 2 parameters, 1 given in %s on line %d
-NULL
-
-Warning: popen(abc.txt,rw): Invalid argument in %s on line %d
-bool(false)
-
-Warning: pclose() expects exactly 1 parameter, 0 given in %s on line %d
-bool(false)
-
-Warning: pclose() expects exactly 1 parameter, 2 given in %s on line %d
-bool(false)
-
-Warning: pclose() expects parameter 1 to be resource, int given in %s on line %d
-bool(false)
-
-
---- Done ---'abc.txt' is not recognized as an internal or external command,
-operable program or batch file.
diff --git a/ext/standard/tests/file/popen_pclose_error.phpt b/ext/standard/tests/file/popen_pclose_error.phpt
index 280e93427a..93ed5d946e 100644
--- a/ext/standard/tests/file/popen_pclose_error.phpt
+++ b/ext/standard/tests/file/popen_pclose_error.phpt
@@ -2,8 +2,8 @@
Test popen() and pclose function: error conditions
--SKIPIF--
<?php
-if(substr(PHP_OS, 0, 3) == 'WIN' || strtoupper( substr(PHP_OS, 0, 3) ) == 'SUN')
- die("skip Not Valid for Windows & Sun Solaris");
+if (strtoupper( substr(PHP_OS, 0, 3) ) == 'SUN')
+ die("skip Not Valid for Sun Solaris");
?>
--FILE--
<?php