summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-07-22 17:49:08 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-07-22 17:49:08 +0200
commit5664035ffef093a200d220330f3b17ee9b601fb2 (patch)
tree5bc6f394c12a78a19a93d84758a151824c1a4ca1
parentd59aac58b3e7da7ad01a194fe9840d89725ea229 (diff)
downloadphp-git-5664035ffef093a200d220330f3b17ee9b601fb2.tar.gz
Also report errors from Zend stream reader operation
-rw-r--r--Zend/zend_stream.c23
-rw-r--r--Zend/zend_stream.h2
-rw-r--r--ext/phar/phar.c2
3 files changed, 20 insertions, 7 deletions
diff --git a/Zend/zend_stream.c b/Zend/zend_stream.c
index 69110c50ed..a3490ffc93 100644
--- a/Zend/zend_stream.c
+++ b/Zend/zend_stream.c
@@ -25,7 +25,7 @@
ZEND_DLIMPORT int isatty(int fd);
-static size_t zend_stream_stdio_reader(void *handle, char *buf, size_t len) /* {{{ */
+static ssize_t zend_stream_stdio_reader(void *handle, char *buf, size_t len) /* {{{ */
{
return fread(buf, 1, len, (FILE*)handle);
} /* }}} */
@@ -95,7 +95,7 @@ static int zend_stream_getc(zend_file_handle *file_handle) /* {{{ */
return EOF;
} /* }}} */
-static size_t zend_stream_read(zend_file_handle *file_handle, char *buf, size_t len) /* {{{ */
+static ssize_t zend_stream_read(zend_file_handle *file_handle, char *buf, size_t len) /* {{{ */
{
if (file_handle->handle.stream.isatty) {
int c = '*';
@@ -148,10 +148,18 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t
}
if (size) {
- file_handle->buf = *buf = safe_emalloc(1, size, ZEND_MMAP_AHEAD);
- file_handle->len = zend_stream_read(file_handle, *buf, size);
+ ssize_t read;
+ *buf = safe_emalloc(1, size, ZEND_MMAP_AHEAD);
+ read = zend_stream_read(file_handle, *buf, size);
+ if (read < 0) {
+ efree(*buf);
+ return FAILURE;
+ }
+ file_handle->buf = *buf;
+ file_handle->len = read;
} else {
- size_t read, remain = 4*1024;
+ size_t remain = 4*1024;
+ ssize_t read;
*buf = emalloc(remain);
size = 0;
@@ -164,6 +172,11 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t
remain = size;
}
}
+ if (read < 0) {
+ efree(*buf);
+ return FAILURE;
+ }
+
file_handle->len = size;
if (size && remain < ZEND_MMAP_AHEAD) {
*buf = safe_erealloc(*buf, size, 1, ZEND_MMAP_AHEAD);
diff --git a/Zend/zend_stream.h b/Zend/zend_stream.h
index 87aec7aff3..66a7e5198c 100644
--- a/Zend/zend_stream.h
+++ b/Zend/zend_stream.h
@@ -29,7 +29,7 @@
* These functions are private to the engine.
* */
typedef size_t (*zend_stream_fsizer_t)(void* handle);
-typedef size_t (*zend_stream_reader_t)(void* handle, char *buf, size_t len);
+typedef ssize_t (*zend_stream_reader_t)(void* handle, char *buf, size_t len);
typedef void (*zend_stream_closer_t)(void* handle);
#define ZEND_MMAP_AHEAD 32
diff --git a/ext/phar/phar.c b/ext/phar/phar.c
index db81b14d8e..0deec63368 100644
--- a/ext/phar/phar.c
+++ b/ext/phar/phar.c
@@ -3215,7 +3215,7 @@ static const zend_function_entry phar_functions[] = {
};
/* }}}*/
-static size_t phar_zend_stream_reader(void *handle, char *buf, size_t len) /* {{{ */
+static ssize_t phar_zend_stream_reader(void *handle, char *buf, size_t len) /* {{{ */
{
return php_stream_read(phar_get_pharfp((phar_archive_data*)handle), buf, len);
}