]> granicus.if.org Git - php/commitdiff
Check for exception after applying stream filters
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 8 Oct 2019 10:18:59 +0000 (12:18 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 8 Oct 2019 10:32:57 +0000 (12:32 +0200)
This makes the stream opening actually fail, and avoids assertion
failures when we tokenize with EG(exception) set.

Also avoid throwing an additional warning after an exception has
already been thrown.

ext/standard/php_fopen_wrapper.c
ext/standard/tests/file/bug38450_2.phpt
ext/standard/tests/file/bug38450_3.phpt
ext/standard/tests/filters/object_init_failure_2.phpt [new file with mode: 0644]
ext/standard/tests/streams/bug77664.phpt
ext/standard/tests/streams/user-stream-error.phpt
main/streams/streams.c

index 06d2b5f28ccde2ddbc18997a1fdbca4123a06743..b1638342aadb49b2cc986488c0cb8b728e2f3dac 100644 (file)
@@ -374,6 +374,11 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const char *pa
                }
                efree(pathdup);
 
+               if (EG(exception)) {
+                       php_stream_close(stream);
+                       return NULL;
+               }
+
                return stream;
        } else {
                /* invalid php://thingy */
index 774de66bfe7fe1dced2dd4696c4e3f73c057551b..33a13da0dbb5a86095babb961d0ce13b3bfcb99c 100644 (file)
@@ -102,8 +102,6 @@ var_dump($myvar);
 echo "Done\n";
 ?>
 --EXPECTF--
-Warning: fopen(var://myvar): failed to open stream: "VariableStream::stream_open" call failed in %s on line %d
-
 Fatal error: Uncaught Exception: constructor in %s:%d
 Stack trace:
 #0 [internal function]: VariableStream->__construct()
index 0bcaeb2a89ff148dec788cb9095191c0572d6c06..8a5c6965873add29145e691d8a5dddf9488263f9 100644 (file)
@@ -102,8 +102,6 @@ var_dump($myvar);
 echo "Done\n";
 ?>
 --EXPECTF--
-Warning: fopen(var://myvar): failed to open stream: "VariableStream::stream_open" call failed in %sbug38450_3.php on line %d
-
 Fatal error: Uncaught ArgumentCountError: Too few arguments to function VariableStream::__construct(), 0 passed and exactly 1 expected in %sbug38450_3.php:7
 Stack trace:
 #0 [internal function]: VariableStream->__construct()
diff --git a/ext/standard/tests/filters/object_init_failure_2.phpt b/ext/standard/tests/filters/object_init_failure_2.phpt
new file mode 100644 (file)
index 0000000..6a1458f
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+Creating the stream filter object may fail (include variation)
+--FILE--
+<?php
+class SampleFilter extends php_user_filter {
+    private $data = \FOO;
+}
+stream_filter_register('sample.filter', SampleFilter::class);
+try {
+    include 'php://filter/read=sample.filter/resource='. __FILE__;
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+?>
+--EXPECTF--
+Warning: main(): unable to create or locate filter "sample.filter" in %s on line %d
+
+Warning: main(): Unable to create filter (sample.filter) in %s on line %d
+
+Warning: main(): Failed opening '%s' for inclusion (include_path='%s') in %s on line %d
+Undefined constant 'FOO'
index 6a925417e2ab8b54a5204fa25c7eaaf019d96353..ff2e3170261bb98c855d9ed7e13f6a102e529a19 100644 (file)
@@ -10,8 +10,6 @@ stream_wrapper_register('error',ErrorWrapper::class);
 file_get_contents('error://test');
 ?>
 --EXPECTF--
-Warning: file_get_contents(error://test): failed to open stream: operation failed in %sbug77664.php on line %d
-
 Fatal error: Uncaught Error: Undefined class constant 'self::INVALID' in %sbug77664.php:%d
 Stack trace:
 #0 %sbug77664.php(%d): file_get_contents('error://test')
index 5cc87e73607dd3b4a7d787c24cf3913961db8f83..1bb46f30944f7211beabe7ccde351e0f94c95d75 100644 (file)
@@ -12,8 +12,6 @@ stream_wrapper_register('mystream', 'FailStream');
 fopen('mystream://foo', 'r');
 echo 'Done';
 --EXPECTF--
-Warning: fopen(mystream://foo): failed to open stream: "FailStream::stream_open" call failed in %s%euser-stream-error.php on line %d
-
 Fatal error: Uncaught Error: Call to undefined function _some_undefined_function() in %s%euser-stream-error.php:%d
 Stack trace:
 #0 [internal function]: FailStream->stream_open('mystream://foo', 'r', 0, NULL)
index a2c716e17c2dbf1881b79f1a830a08a4609d587a..705f3bc633b41274a263c6d743dc3a8d539136df 100644 (file)
@@ -148,10 +148,16 @@ static zend_llist *php_get_wrapper_errors_list(php_stream_wrapper *wrapper)
 /* {{{ wrapper error reporting */
 void php_stream_display_wrapper_errors(php_stream_wrapper *wrapper, const char *path, const char *caption)
 {
-       char *tmp = estrdup(path);
+       char *tmp;
        char *msg;
        int free_msg = 0;
 
+       if (EG(exception)) {
+               /* Don't emit additional warnings if an exception has already been thrown. */
+               return;
+       }
+
+       tmp = estrdup(path);
        if (wrapper) {
                zend_llist *err_list = php_get_wrapper_errors_list(wrapper);
                if (err_list) {