mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
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:
parent
1bdb30a429
commit
4d11a8eedf
2 changed files with 34 additions and 6 deletions
23
ext/standard/tests/streams/user-stream-error.phpt
Normal file
23
ext/standard/tests/streams/user-stream-error.phpt
Normal 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
|
|
@ -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! */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue