summaryrefslogtreecommitdiff
path: root/main/streams/streams.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/streams/streams.c')
-rwxr-xr-xmain/streams/streams.c35
1 files changed, 12 insertions, 23 deletions
diff --git a/main/streams/streams.c b/main/streams/streams.c
index 704e2ccd20..65421c299d 100755
--- a/main/streams/streams.c
+++ b/main/streams/streams.c
@@ -448,10 +448,6 @@ static void php_stream_fill_read_buffer(php_stream *stream, size_t size TSRMLS_D
php_stream_bucket_brigade brig_in = { NULL, NULL }, brig_out = { NULL, NULL };
php_stream_bucket_brigade *brig_inp = &brig_in, *brig_outp = &brig_out, *brig_swap;
- /* Invalidate the existing cache, otherwise reads can fail, see note in
- main/streams/filter.c::_php_stream_filter_append */
- stream->writepos = stream->readpos = 0;
-
/* allocate a buffer for reading chunks */
chunk_buf = emalloc(stream->chunk_size);
@@ -540,16 +536,16 @@ static void php_stream_fill_read_buffer(php_stream *stream, size_t size TSRMLS_D
efree(chunk_buf);
} else {
- /* reduce buffer memory consumption if possible, to avoid a realloc */
- if (stream->readbuf && stream->readbuflen - stream->writepos < stream->chunk_size) {
- memmove(stream->readbuf, stream->readbuf + stream->readpos, stream->readbuflen - stream->readpos);
- stream->writepos -= stream->readpos;
- stream->readpos = 0;
- }
/* is there enough data in the buffer ? */
- while (stream->writepos - stream->readpos < (off_t)size) {
+ if (stream->writepos - stream->readpos < (off_t)size) {
size_t justread = 0;
- size_t toread;
+
+ /* reduce buffer memory consumption if possible, to avoid a realloc */
+ if (stream->readbuf && stream->readbuflen - stream->writepos < stream->chunk_size) {
+ memmove(stream->readbuf, stream->readbuf + stream->readpos, stream->readbuflen - stream->readpos);
+ stream->writepos -= stream->readpos;
+ stream->readpos = 0;
+ }
/* grow the buffer if required
* TODO: this can fail for persistent streams */
@@ -559,17 +555,13 @@ static void php_stream_fill_read_buffer(php_stream *stream, size_t size TSRMLS_D
stream->is_persistent);
}
- toread = stream->readbuflen - stream->writepos;
justread = stream->ops->read(stream, stream->readbuf + stream->writepos,
- toread
+ stream->readbuflen - stream->writepos
TSRMLS_CC);
if (justread != (size_t)-1) {
stream->writepos += justread;
}
- if (stream->eof || justread != toread) {
- break;
- }
}
}
}
@@ -650,7 +642,7 @@ PHPAPI int _php_stream_eof(php_stream *stream TSRMLS_DC)
/* use the configured timeout when checking eof */
if (!stream->eof && PHP_STREAM_OPTION_RETURN_ERR ==
php_stream_set_option(stream, PHP_STREAM_OPTION_CHECK_LIVENESS,
- 0, NULL)) {
+ -1, NULL)) {
stream->eof = 1;
}
@@ -890,9 +882,6 @@ PHPAPI char *php_stream_get_record(php_stream *stream, size_t maxlen, size_t *re
}
if (!e) {
- if (seek_len < maxlen && !stream->eof) {
- return NULL;
- }
toread = maxlen;
} else {
toread = e - (char *) stream->readbuf - stream->readpos;
@@ -1243,7 +1232,7 @@ PHPAPI size_t _php_stream_copy_to_mem(php_stream *src, char **buf, size_t maxlen
if (maxlen > 0) {
ptr = *buf = pemalloc_rel_orig(maxlen + 1, persistent);
- while ((len < maxlen) && !php_stream_eof(src)) {
+ while ((len < maxlen) & !php_stream_eof(src)) {
ret = php_stream_read(src, ptr, maxlen - len);
len += ret;
ptr += ret;
@@ -1528,7 +1517,7 @@ PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, char
n++;
}
- if ((*p == ':') && (n > 1) && (!strncmp("//", p+1, 2) || (n == 4 && !memcmp("data:", path, 5)))) {
+ if ((*p == ':') && (n > 1) && (!strncmp("//", p+1, 2) || !memcmp("data", path, 4))) {
protocol = path;
} else if (n == 5 && strncasecmp(path, "zlib:", 5) == 0) {
/* BC with older php scripts and zlib wrapper */