]> granicus.if.org Git - php/commitdiff
Fix #67626
authorJulien Pauli <jpauli@php.net>
Tue, 15 Jul 2014 15:18:56 +0000 (17:18 +0200)
committerStanislav Malyshev <stas@php.net>
Mon, 9 Mar 2015 06:40:55 +0000 (23:40 -0700)
ext/standard/tests/streams/bug67626.phpt [new file with mode: 0644]
main/streams/userspace.c

diff --git a/ext/standard/tests/streams/bug67626.phpt b/ext/standard/tests/streams/bug67626.phpt
new file mode 100644 (file)
index 0000000..67c2c3f
--- /dev/null
@@ -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
index 0152b889b03e618f7bf65d74e46c3d9b192d2dea..e4a26630366e6bf301e3113093f71a5a95b835d5 100644 (file)
@@ -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);