summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-07-17 11:01:57 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-07-17 11:22:31 +0200
commit5a90dc77b8f244f603082aea022fadc0ce2c009c (patch)
treea5682b1836a838aa9592cc831142b13042b752ec /Zend
parent6fbab09ef042df66153e4feaae8e07091d3d173e (diff)
downloadphp-git-5a90dc77b8f244f603082aea022fadc0ce2c009c.tar.gz
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.
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_stream.c65
-rw-r--r--Zend/zend_stream.h2
2 files changed, 19 insertions, 48 deletions
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;