diff options
author | Sara Golemon <pollita@php.net> | 2016-10-11 21:35:10 -0700 |
---|---|---|
committer | Sara Golemon <pollita@php.net> | 2016-10-11 21:44:14 -0700 |
commit | 4d11a8eedf976f081dcc1b525c8a79ca18c9d67c (patch) | |
tree | 042a3f4b48b6de037da38cb194f17205cab835dd | |
parent | 1bdb30a429b3249f4dbd0a29b0da18bb3b57c6f1 (diff) | |
download | php-git-4d11a8eedf976f081dcc1b525c8a79ca18c9d67c.tar.gz |
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
-rw-r--r-- | ext/standard/tests/streams/user-stream-error.phpt | 23 | ||||
-rw-r--r-- | main/streams/userspace.c | 17 |
2 files changed, 34 insertions, 6 deletions
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 0000000000..bfa625be2c --- /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 63a351a59b..504f4d7282 100644 --- a/main/streams/userspace.c +++ b/main/streams/userspace.c @@ -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! */ |