This commit is contained in:
Julien Pauli 2014-07-15 17:18:56 +02:00 committed by Stanislav Malyshev
parent 37ecfdad09
commit 2f06413340
2 changed files with 57 additions and 2 deletions

View 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

View File

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