From: Julien Pauli <jpauli@php.net> Date: Tue, 15 Jul 2014 15:18:56 +0000 (+0200) Subject: Fix #67626 X-Git-Tag: php-5.6.8RC1~99 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7d47d9fe23274d750bee90a4d7f2251ebaaa4e1a;p=php Fix #67626 --- diff --git a/ext/standard/tests/streams/bug67626.phpt b/ext/standard/tests/streams/bug67626.phpt new file mode 100644 index 0000000000..67c2c3f8e0 --- /dev/null +++ b/ext/standard/tests/streams/bug67626.phpt @@ -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 \ No newline at end of file diff --git a/main/streams/userspace.c b/main/streams/userspace.c index 0152b889b0..e4a2663036 100644 --- a/main/streams/userspace.c +++ b/main/streams/userspace.c @@ -646,6 +646,11 @@ static size_t php_userstreamop_write(php_stream *stream, const char *buf, size_t zval_ptr_dtor(&zbufptr); didwrite = 0; + + if (EG(exception)) { + return 0; + } + if (call_result == SUCCESS && retval != NULL) { convert_to_long(retval); didwrite = Z_LVAL_P(retval); @@ -693,6 +698,12 @@ static size_t php_userstreamop_read(php_stream *stream, char *buf, size_t count 1, args, 0, NULL TSRMLS_CC); + zval_ptr_dtor(&zcount); + + if (EG(exception)) { + return -1; + } + if (call_result == SUCCESS && retval != NULL) { convert_to_string(retval); didread = Z_STRLEN_P(retval); @@ -707,7 +718,6 @@ static size_t php_userstreamop_read(php_stream *stream, char *buf, size_t count php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s::" USERSTREAM_READ " is not implemented!", us->wrapper->classname); } - zval_ptr_dtor(&zcount); if (retval) { zval_ptr_dtor(&retval);