com php-src: Clear FG(user_stream_current_filename) when bailing out: ext/standard/tests/streams/user-st ream-error.phpt main/streams/userspace.c
| From: | Sara Golemon | Date: | Wed, 12 Oct 2016 04:46:02 +0000 |
| Subject: | com php-src: Clear FG(user_stream_current_filename) when bailing out: ext/standard/tests/streams/user-st ream-error.phpt main/streams/userspace.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-94937@lists.php.net to get a copy of this message | ||
Commit: 9f86cdaf7fc44c0d97a35bc4d04622e3d3d53f4d
Author: Sara Golemon <pollita@php.net> Tue, 11 Oct 2016 21:35:10 -0700
Parents: 6046a99b97b5abab2e75d73bc9d73062f1943126
Branches: PHP-7.1
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=9f86cdaf7fc44c0d97a35bc4d04622e3d3d53f4d
Log:
Clear FG(user_stream_current_filename) when bailing out
If a userwrapper opener E_ERRORs then FG(user_stream_current_filename)
would remain set until the next request and would not be pointing
at unallocated memory.
Catch the bailout, clear the variable, then continue bailing.
Closes https://bugs.php.net/bug.php?id=73188
Changed paths:
A ext/standard/tests/streams/user-stream-error.phpt
M main/streams/userspace.c
Diff:
diff --git a/ext/standard/tests/streams/user-stream-error.phpt
b/ext/standard/tests/streams/user-stream-error.phpt
new file mode 100644
index 0000000..bfa625b
--- /dev/null
+++ b/ext/standard/tests/streams/user-stream-error.phpt
@@ -0,0 +1,23 @@
+--TEST--
+E_ERROR during UserStream Open
+--FILE--
+<?php
+
+class FailStream {
+ public function stream_open($path, $mode, $options, &$opened_path) {
+ _some_undefined_function();
+ }
+}
+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/user-stream-error.php on line %d
+
+Fatal error: Uncaught Error: Call to undefined function _some_undefined_function() in
%s/user-stream-error.php:%d
+Stack trace:
+#0 [internal function]: FailStream->stream_open('mystream://foo', 'r', 0,
NULL)
+#1 %s/user-stream-error.php(%d): fopen('mystream://foo', 'r')
+#2 {main}
+ thrown in %s/user-stream-error.php on line %d
diff --git a/main/streams/userspace.c b/main/streams/userspace.c
index eb8b32e..6afa3b0 100644
--- a/main/streams/userspace.c
+++ b/main/streams/userspace.c
@@ -370,12 +370,17 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char
*
ZVAL_STRING(&zfuncname, USERSTREAM_OPEN);
- call_result = call_user_function_ex(NULL,
- Z_ISUNDEF(us->object)? NULL : &us->object,
- &zfuncname,
- &zretval,
- 4, args,
- 0, NULL );
+ zend_try {
+ call_result = call_user_function_ex(NULL,
+ Z_ISUNDEF(us->object)? NULL : &us->object,
+ &zfuncname,
+ &zretval,
+ 4, args,
+ 0, NULL );
+ } zend_catch {
+ FG(user_stream_current_filename) = NULL;
+ zend_bailout();
+ } zend_end_try();
if (call_result == SUCCESS && Z_TYPE(zretval) != IS_UNDEF &&
zval_is_true(&zretval)) {
/* the stream is now open! */