]> granicus.if.org Git - php/commitdiff
Avoid unused fstat() call
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 17 Jul 2019 09:01:57 +0000 (11:01 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 17 Jul 2019 09:22:31 +0000 (11:22 +0200)
If we're including a file via PHP streams, we're not going to trust
the reported file size anyway and populate in a loop -- so don't
bother determining the file size in the first place. Only do this
for non-tty HANDLE_FP now, which is the only case where this
information was used.

Zend/zend_stream.c
Zend/zend_stream.h
ext/phar/phar.c
main/main.c

index cf1a3c107b5ce6a94b79d67ea7b0fe3b2201762c..2403800db7339bf7410bf5d97294f2788a7725f6 100644 (file)
 #include "zend_compile.h"
 #include "zend_stream.h"
 
+#ifndef S_ISREG
+# define S_ISREG(m) 1
+#endif
+
 ZEND_DLIMPORT int isatty(int fd);
 
 static size_t zend_stream_stdio_reader(void *handle, char *buf, size_t len) /* {{{ */
@@ -37,39 +41,6 @@ static void zend_stream_stdio_closer(void *handle) /* {{{ */
        }
 } /* }}} */
 
-static size_t zend_stream_stdio_fsizer(void *handle) /* {{{ */
-{
-       zend_stat_t buf;
-       if (handle && zend_fstat(fileno((FILE*)handle), &buf) == 0) {
-#ifdef S_ISREG
-               if (!S_ISREG(buf.st_mode)) {
-                       return 0;
-               }
-#endif
-               return buf.st_size;
-       }
-       return 0;
-} /* }}} */
-
-static size_t zend_stream_fsize(zend_file_handle *file_handle) /* {{{ */
-{
-       zend_stat_t buf;
-
-       if (file_handle->type == ZEND_HANDLE_STREAM) {
-               return file_handle->handle.stream.fsizer(file_handle->handle.stream.handle);
-       }
-       if (file_handle->handle.fp && zend_fstat(fileno(file_handle->handle.fp), &buf) == 0) {
-#ifdef S_ISREG
-               if (!S_ISREG(buf.st_mode)) {
-                       return 0;
-               }
-#endif
-               return buf.st_size;
-       }
-
-       return -1;
-} /* }}} */
-
 ZEND_API void zend_stream_init_fp(zend_file_handle *handle, FILE *fp, const char *filename) {
        memset(handle, 0, sizeof(zend_file_handle));
        handle->type = ZEND_HANDLE_FP;
@@ -125,8 +96,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_bool is_fp = 0;
+       size_t size = 0;
 
        if (file_handle->buf) {
                *buf = file_handle->buf;
@@ -141,25 +111,28 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t
        }
 
        if (file_handle->type == ZEND_HANDLE_FP) {
-               if (!file_handle->handle.fp) {
+               FILE *fp = file_handle->handle.fp;
+               int is_tty;
+               if (!fp) {
                        return FAILURE;
                }
 
-               is_fp = 1;
+               is_tty = isatty(fileno(fp));
+               if (!is_tty) {
+                       zend_stat_t buf;
+                       if (zend_fstat(fileno(fp), &buf) == 0 && S_ISREG(buf.st_mode)) {
+                               size = buf.st_size;
+                       }
+               }
+
                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));
+               file_handle->handle.stream.handle = fp;
+               file_handle->handle.stream.isatty = is_tty;
                file_handle->handle.stream.reader = (zend_stream_reader_t)zend_stream_stdio_reader;
                file_handle->handle.stream.closer = (zend_stream_closer_t)zend_stream_stdio_closer;
-               file_handle->handle.stream.fsizer = (zend_stream_fsizer_t)zend_stream_stdio_fsizer;
-       }
-
-       size = zend_stream_fsize(file_handle);
-       if (size == (size_t)-1) {
-               return FAILURE;
        }
 
-       if (is_fp && !file_handle->handle.stream.isatty && size) {
+       if (size) {
                file_handle->buf = *buf = safe_emalloc(1, size, ZEND_MMAP_AHEAD);
                file_handle->len = zend_stream_read(file_handle, *buf, size);
        } else {
index 87aec7aff3cd161abc21c7788b29c548b500b524..ae5c73028fe644c916ea041fc68f687d1ebf5375 100644 (file)
@@ -28,7 +28,6 @@
 /* Lightweight stream implementation for the ZE scanners.
  * 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 void   (*zend_stream_closer_t)(void* handle);
 
@@ -44,7 +43,6 @@ typedef struct _zend_stream {
        void        *handle;
        int         isatty;
        zend_stream_reader_t   reader;
-       zend_stream_fsizer_t   fsizer;
        zend_stream_closer_t   closer;
 } zend_stream;
 
index db81b14d8e9f672c5f8bcfef5ab7f049c87af3a6..27ea2ff679f33fe54ab24eeda0a48a9e933e2c9d 100644 (file)
@@ -3221,11 +3221,6 @@ static size_t phar_zend_stream_reader(void *handle, char *buf, size_t len) /* {{
 }
 /* }}} */
 
-static size_t phar_zend_stream_fsizer(void *handle) /* {{{ */
-{
-       return ((phar_archive_data*)handle)->halt_offset + 32;
-} /* }}} */
-
 zend_op_array *(*phar_orig_compile_file)(zend_file_handle *file_handle, int type);
 #define phar_orig_zend_open zend_stream_open_function
 
@@ -3282,7 +3277,6 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type)
                                file_handle->handle.stream.handle  = phar;
                                file_handle->handle.stream.reader  = phar_zend_stream_reader;
                                file_handle->handle.stream.closer  = NULL;
-                               file_handle->handle.stream.fsizer  = phar_zend_stream_fsizer;
                                file_handle->handle.stream.isatty  = 0;
                                phar->is_persistent ?
                                        php_stream_rewind(PHAR_G(cached_fp)[phar->phar_pos].fp) :
index 809ebbfd5e3f0f6067de4aadd9196bd9d810f296..bd713d3137b3107a18fadf15367b6ae1e3b7ec4d 100644 (file)
@@ -1562,16 +1562,6 @@ static void php_zend_stream_closer(void *handle) /* {{{ */
 }
 /* }}} */
 
-static size_t php_zend_stream_fsizer(void *handle) /* {{{ */
-{
-       php_stream_statbuf  ssb;
-       if (php_stream_stat((php_stream*)handle, &ssb) == 0) {
-               return ssb.sb.st_size;
-       }
-       return 0;
-}
-/* }}} */
-
 static int php_stream_open_for_zend(const char *filename, zend_file_handle *handle) /* {{{ */
 {
        return php_stream_open_for_zend_ex(filename, handle, USE_PATH|REPORT_ERRORS|STREAM_OPEN_FOR_INCLUDE);
@@ -1589,7 +1579,6 @@ PHPAPI int php_stream_open_for_zend_ex(const char *filename, zend_file_handle *h
                handle->opened_path = opened_path;
                handle->handle.stream.handle  = stream;
                handle->handle.stream.reader  = (zend_stream_reader_t)_php_stream_read;
-               handle->handle.stream.fsizer  = php_zend_stream_fsizer;
                handle->handle.stream.isatty  = 0;
                handle->handle.stream.closer = php_zend_stream_closer;
                /* suppress warning if this stream is not explicitly closed */