Also report errors from Zend stream reader operation
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 22 Jul 2019 15:49:08 +0000 (17:49 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 22 Jul 2019 15:49:08 +0000 (17:49 +0200)
Zend/zend_stream.c
Zend/zend_stream.h
ext/phar/phar.c

index 69110c50ed1106b19cace7916a61c1a62199f109..a3490ffc935585faefe1e06ee2d9bdff2a7904ae 100644 (file)
@@ -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);
index 87aec7aff3cd161abc21c7788b29c548b500b524..66a7e5198ceb69f02b3d1f06f4d2ac987eb2d3ba 100644 (file)
@@ -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
index db81b14d8e9f672c5f8bcfef5ab7f049c87af3a6..0deec63368565230962c22b3bcf524e92d8c3f7e 100644 (file)
@@ -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);
 }