From: Nikita Popov Date: Mon, 22 Jul 2019 15:49:08 +0000 (+0200) Subject: Also report errors from Zend stream reader operation X-Git-Tag: php-7.4.0beta1~7 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5664035ffef093a200d220330f3b17ee9b601fb2;p=php Also report errors from Zend stream reader operation --- 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); }