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
This commit is contained in:
Sara Golemon 2016-10-11 21:35:10 -07:00
parent 1bdb30a429
commit 4d11a8eedf
2 changed files with 34 additions and 6 deletions

View file

@ -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

View file

@ -372,12 +372,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! */