Skip to content

Commit 3c2f433

Browse files
committed
Merge branch 'PHP-7.4'
2 parents 995b391 + c2c5c9a commit 3c2f433

File tree

4 files changed

+52
-18
lines changed

4 files changed

+52
-18
lines changed

Zend/zend_stream.c

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,6 @@
2323
#include "zend_compile.h"
2424
#include "zend_stream.h"
2525

26-
#ifndef S_ISREG
27-
# define S_ISREG(m) 1
28-
#endif
29-
3026
ZEND_DLIMPORT int isatty(int fd);
3127

3228
static size_t zend_stream_stdio_reader(void *handle, char *buf, size_t len) /* {{{ */
@@ -41,6 +37,29 @@ static void zend_stream_stdio_closer(void *handle) /* {{{ */
4137
}
4238
} /* }}} */
4339

40+
static size_t zend_stream_stdio_fsizer(void *handle) /* {{{ */
41+
{
42+
zend_stat_t buf;
43+
if (handle && zend_fstat(fileno((FILE*)handle), &buf) == 0) {
44+
#ifdef S_ISREG
45+
if (!S_ISREG(buf.st_mode)) {
46+
return 0;
47+
}
48+
#endif
49+
return buf.st_size;
50+
}
51+
return -1;
52+
} /* }}} */
53+
54+
static size_t zend_stream_fsize(zend_file_handle *file_handle) /* {{{ */
55+
{
56+
ZEND_ASSERT(file_handle->type == ZEND_HANDLE_STREAM);
57+
if (file_handle->handle.stream.isatty) {
58+
return 0;
59+
}
60+
return file_handle->handle.stream.fsizer(file_handle->handle.stream.handle);
61+
} /* }}} */
62+
4463
ZEND_API void zend_stream_init_fp(zend_file_handle *handle, FILE *fp, const char *filename) {
4564
memset(handle, 0, sizeof(zend_file_handle));
4665
handle->type = ZEND_HANDLE_FP;
@@ -96,7 +115,7 @@ static size_t zend_stream_read(zend_file_handle *file_handle, char *buf, size_t
96115

97116
ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t *len) /* {{{ */
98117
{
99-
size_t size = 0;
118+
size_t size;
100119

101120
if (file_handle->buf) {
102121
*buf = file_handle->buf;
@@ -111,25 +130,21 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t
111130
}
112131

113132
if (file_handle->type == ZEND_HANDLE_FP) {
114-
FILE *fp = file_handle->handle.fp;
115-
int is_tty;
116-
if (!fp) {
133+
if (!file_handle->handle.fp) {
117134
return FAILURE;
118135
}
119136

120-
is_tty = isatty(fileno(fp));
121-
if (!is_tty) {
122-
zend_stat_t buf;
123-
if (zend_fstat(fileno(fp), &buf) == 0 && S_ISREG(buf.st_mode)) {
124-
size = buf.st_size;
125-
}
126-
}
127-
128137
file_handle->type = ZEND_HANDLE_STREAM;
129-
file_handle->handle.stream.handle = fp;
130-
file_handle->handle.stream.isatty = is_tty;
138+
file_handle->handle.stream.handle = file_handle->handle.fp;
139+
file_handle->handle.stream.isatty = isatty(fileno((FILE *)file_handle->handle.stream.handle));
131140
file_handle->handle.stream.reader = (zend_stream_reader_t)zend_stream_stdio_reader;
132141
file_handle->handle.stream.closer = (zend_stream_closer_t)zend_stream_stdio_closer;
142+
file_handle->handle.stream.fsizer = (zend_stream_fsizer_t)zend_stream_stdio_fsizer;
143+
}
144+
145+
size = zend_stream_fsize(file_handle);
146+
if (size == (size_t)-1) {
147+
return FAILURE;
133148
}
134149

135150
if (size) {

Zend/zend_stream.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
/* Lightweight stream implementation for the ZE scanners.
2929
* These functions are private to the engine.
3030
* */
31+
typedef size_t (*zend_stream_fsizer_t)(void* handle);
3132
typedef size_t (*zend_stream_reader_t)(void* handle, char *buf, size_t len);
3233
typedef void (*zend_stream_closer_t)(void* handle);
3334

@@ -43,6 +44,7 @@ typedef struct _zend_stream {
4344
void *handle;
4445
int isatty;
4546
zend_stream_reader_t reader;
47+
zend_stream_fsizer_t fsizer;
4648
zend_stream_closer_t closer;
4749
} zend_stream;
4850

ext/phar/phar.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3221,6 +3221,11 @@ static size_t phar_zend_stream_reader(void *handle, char *buf, size_t len) /* {{
32213221
}
32223222
/* }}} */
32233223

3224+
static size_t phar_zend_stream_fsizer(void *handle) /* {{{ */
3225+
{
3226+
return ((phar_archive_data*)handle)->halt_offset + 32;
3227+
} /* }}} */
3228+
32243229
zend_op_array *(*phar_orig_compile_file)(zend_file_handle *file_handle, int type);
32253230
#define phar_orig_zend_open zend_stream_open_function
32263231

@@ -3277,6 +3282,7 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type)
32773282
file_handle->handle.stream.handle = phar;
32783283
file_handle->handle.stream.reader = phar_zend_stream_reader;
32793284
file_handle->handle.stream.closer = NULL;
3285+
file_handle->handle.stream.fsizer = phar_zend_stream_fsizer;
32803286
file_handle->handle.stream.isatty = 0;
32813287
phar->is_persistent ?
32823288
php_stream_rewind(PHAR_G(cached_fp)[phar->phar_pos].fp) :

main/main.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1536,6 +1536,16 @@ static void php_zend_stream_closer(void *handle) /* {{{ */
15361536
}
15371537
/* }}} */
15381538

1539+
static size_t php_zend_stream_fsizer(void *handle) /* {{{ */
1540+
{
1541+
php_stream_statbuf ssb;
1542+
if (php_stream_stat((php_stream*)handle, &ssb) == 0) {
1543+
return ssb.sb.st_size;
1544+
}
1545+
return 0;
1546+
}
1547+
/* }}} */
1548+
15391549
static int php_stream_open_for_zend(const char *filename, zend_file_handle *handle) /* {{{ */
15401550
{
15411551
return php_stream_open_for_zend_ex(filename, handle, USE_PATH|REPORT_ERRORS|STREAM_OPEN_FOR_INCLUDE);
@@ -1553,6 +1563,7 @@ PHPAPI int php_stream_open_for_zend_ex(const char *filename, zend_file_handle *h
15531563
handle->opened_path = opened_path;
15541564
handle->handle.stream.handle = stream;
15551565
handle->handle.stream.reader = (zend_stream_reader_t)_php_stream_read;
1566+
handle->handle.stream.fsizer = php_zend_stream_fsizer;
15561567
handle->handle.stream.isatty = 0;
15571568
handle->handle.stream.closer = php_zend_stream_closer;
15581569
/* suppress warning if this stream is not explicitly closed */

0 commit comments

Comments
 (0)