mirror of
https://github.com/php/php-src.git
synced 2024-09-22 10:27:25 +00:00
Fix #67626
This commit is contained in:
parent
37ecfdad09
commit
2f06413340
45
ext/standard/tests/streams/bug67626.phpt
Normal file
45
ext/standard/tests/streams/bug67626.phpt
Normal file
@ -0,0 +1,45 @@
|
||||
--TEST--
|
||||
Bug #67626: Exceptions not properly handled in user stream handlers
|
||||
--FILE--
|
||||
<?php
|
||||
class MyStream
|
||||
{
|
||||
public function stream_open() { return true; }
|
||||
|
||||
public function stream_read()
|
||||
{
|
||||
throw new Exception('stream_read_exception');
|
||||
return 'read';
|
||||
}
|
||||
|
||||
public function stream_eof()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function stream_write()
|
||||
{
|
||||
throw new Exception('stream_write_exception');
|
||||
return 42;
|
||||
}
|
||||
}
|
||||
|
||||
stream_wrapper_register("my", "MyStream");
|
||||
|
||||
$fp = fopen('my://foobar', 'r+');
|
||||
|
||||
try {
|
||||
fread($fp, 42);
|
||||
} catch (Exception $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
echo "\n";
|
||||
try {
|
||||
fwrite($fp, 'foobar');
|
||||
} catch (Exception $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
stream_read_exception
|
||||
stream_write_exception
|
@ -607,6 +607,11 @@ static size_t php_userstreamop_write(php_stream *stream, const char *buf, size_t
|
||||
zval_ptr_dtor(&func_name);
|
||||
|
||||
didwrite = 0;
|
||||
|
||||
if (EG(exception)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (call_result == SUCCESS && Z_TYPE(retval) != IS_UNDEF) {
|
||||
convert_to_long(&retval);
|
||||
didwrite = Z_LVAL(retval);
|
||||
@ -650,6 +655,13 @@ static size_t php_userstreamop_read(php_stream *stream, char *buf, size_t count)
|
||||
1, args,
|
||||
0, NULL);
|
||||
|
||||
zval_ptr_dtor(&args[0);
|
||||
zval_ptr_dtor(&func_name);
|
||||
|
||||
if (EG(exception)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (call_result == SUCCESS && Z_TYPE(retval) != IS_UNDEF) {
|
||||
convert_to_string(&retval);
|
||||
didread = Z_STRLEN(retval);
|
||||
@ -664,11 +676,9 @@ static size_t php_userstreamop_read(php_stream *stream, char *buf, size_t count)
|
||||
php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_READ " is not implemented!",
|
||||
us->wrapper->classname);
|
||||
}
|
||||
zval_ptr_dtor(&args[0]);
|
||||
|
||||
zval_ptr_dtor(&retval);
|
||||
ZVAL_UNDEF(&retval);
|
||||
zval_ptr_dtor(&func_name);
|
||||
|
||||
/* since the user stream has no way of setting the eof flag directly, we need to ask it if we hit eof */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user