]> 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:45:11 +0000 (23:45 -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 33dbbf8d6743fb7263de06e5879b58c52601a74a..69f4fa40298d1da4a6d2b3d0dd71c4f50bcba0f2 100644 (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 */