summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/tests/bug38779.phpt3
-rw-r--r--Zend/zend_stream.c8
-rw-r--r--ext/standard/tests/file/fopencookie.phpt3
-rw-r--r--ext/standard/tests/file/include_streams.phpt3
-rw-r--r--main/main.c2
-rw-r--r--sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt1
6 files changed, 15 insertions, 5 deletions
diff --git a/Zend/tests/bug38779.phpt b/Zend/tests/bug38779.phpt
index 2d0949714e..d552f8e20d 100644
--- a/Zend/tests/bug38779.phpt
+++ b/Zend/tests/bug38779.phpt
@@ -22,6 +22,9 @@ class Loader {
function stream_stat() {
return array('size' => strlen($this->data));
}
+ function stream_set_option($option, $arg1, $arg2) {
+ return false;
+ }
}
stream_wrapper_register('Loader', 'Loader');
require 'Loader://qqq.php';
diff --git a/Zend/zend_stream.c b/Zend/zend_stream.c
index 0360c38b34..cf1a3c107b 100644
--- a/Zend/zend_stream.c
+++ b/Zend/zend_stream.c
@@ -126,7 +126,7 @@ static size_t zend_stream_read(zend_file_handle *file_handle, char *buf, size_t
ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t *len) /* {{{ */
{
size_t size;
- zend_stream_type old_type;
+ zend_bool is_fp = 0;
if (file_handle->buf) {
*buf = file_handle->buf;
@@ -145,6 +145,7 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t
return FAILURE;
}
+ is_fp = 1;
file_handle->type = ZEND_HANDLE_STREAM;
file_handle->handle.stream.handle = file_handle->handle.fp;
file_handle->handle.stream.isatty = isatty(fileno((FILE *)file_handle->handle.stream.handle));
@@ -158,10 +159,7 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t
return FAILURE;
}
- old_type = file_handle->type;
- file_handle->type = ZEND_HANDLE_STREAM; /* we might still be _FP but we need fsize() work */
-
- if (old_type == ZEND_HANDLE_FP && !file_handle->handle.stream.isatty && size) {
+ if (is_fp && !file_handle->handle.stream.isatty && size) {
file_handle->buf = *buf = safe_emalloc(1, size, ZEND_MMAP_AHEAD);
file_handle->len = zend_stream_read(file_handle, *buf, size);
} else {
diff --git a/ext/standard/tests/file/fopencookie.phpt b/ext/standard/tests/file/fopencookie.phpt
index a332d378ca..20fd181cbd 100644
--- a/ext/standard/tests/file/fopencookie.phpt
+++ b/ext/standard/tests/file/fopencookie.phpt
@@ -76,6 +76,9 @@ class userstream {
function stream_stat() {
return array('size' => strlen($this->data));
}
+ function stream_set_option($option, $arg1, $arg2) {
+ return false;
+ }
}
stream_wrapper_register("cookietest", "userstream");
diff --git a/ext/standard/tests/file/include_streams.phpt b/ext/standard/tests/file/include_streams.phpt
index ecd47f418e..0b9446ff9e 100644
--- a/ext/standard/tests/file/include_streams.phpt
+++ b/ext/standard/tests/file/include_streams.phpt
@@ -96,6 +96,9 @@ class mystream
}
}
+ function stream_set_option($option, $arg1, $arg2) {
+ return false;
+ }
}
if (!stream_wrapper_register("test", "mystream")) {
diff --git a/main/main.c b/main/main.c
index 8b1ad1df2e..809ebbfd5e 100644
--- a/main/main.c
+++ b/main/main.c
@@ -1594,6 +1594,8 @@ PHPAPI int php_stream_open_for_zend_ex(const char *filename, zend_file_handle *h
handle->handle.stream.closer = php_zend_stream_closer;
/* suppress warning if this stream is not explicitly closed */
php_stream_auto_cleanup(stream);
+ /* Disable buffering to avoid double buffering between PHP and Zend streams. */
+ php_stream_set_option(stream, PHP_STREAM_OPTION_READ_BUFFER, PHP_STREAM_BUFFER_NONE, NULL);
return SUCCESS;
}
diff --git a/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt b/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt
index 0ddbd6f527..560fac35f8 100644
--- a/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt
+++ b/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt
@@ -59,6 +59,7 @@ final class StreamWrapper
public function stream_close() : bool { return \fclose($this->stream); }
public function stream_eof() : bool { return \feof($this->stream); }
public function stream_stat() { return \fstat($this->stream); }
+ public function stream_set_option($option, $arg1, $arg2) { return false; }
private $stream = false;
}