From: Nikita Popov Date: Wed, 17 Jul 2019 09:01:57 +0000 (+0200) Subject: Avoid unused fstat() call X-Git-Tag: php-7.4.0beta1~81 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5a90dc77b8f244f603082aea022fadc0ce2c009c;p=php Avoid unused fstat() call 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. --- diff --git a/Zend/zend_stream.c b/Zend/zend_stream.c index cf1a3c107b..2403800db7 100644 --- a/Zend/zend_stream.c +++ b/Zend/zend_stream.c @@ -23,6 +23,10 @@ #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 { diff --git a/Zend/zend_stream.h b/Zend/zend_stream.h index 87aec7aff3..ae5c73028f 100644 --- a/Zend/zend_stream.h +++ b/Zend/zend_stream.h @@ -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; diff --git a/ext/phar/phar.c b/ext/phar/phar.c index db81b14d8e..27ea2ff679 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -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) : diff --git a/main/main.c b/main/main.c index 809ebbfd5e..bd713d3137 100644 --- a/main/main.c +++ b/main/main.c @@ -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 */