From: Arnaud Le Blanc Date: Mon, 3 Nov 2008 23:28:45 +0000 (+0000) Subject: Fixed bug #44607 (stream_get_line unable to correctly identify the X-Git-Tag: BEFORE_HEAD_NS_CHANGE~99 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fc62c1ff0a1d460d2ae642dc7acd3fd9f3c18e1a;p=php Fixed bug #44607 (stream_get_line unable to correctly identify the "ending" in the stream content) --- diff --git a/ext/standard/tests/file/bug44607.phpt b/ext/standard/tests/file/bug44607.phpt new file mode 100644 index 0000000000..9eb6d5fcba --- /dev/null +++ b/ext/standard/tests/file/bug44607.phpt @@ -0,0 +1,22 @@ +--TEST-- +Bug #44607 (stream_get_line unable to correctly identify the "ending" in the stream content) +--FILE-- +'; +$tempnam = tempnam(sys_get_temp_dir(), 'php'); +$data = str_repeat('.', 14000); +$data .= $eol; +$data .= $data; +file_put_contents($tempnam, $data); +$fd = fopen($tempnam, 'r'); +var_dump(strlen(stream_get_line($fd, 15000, $eol))); +var_dump(strlen(stream_get_line($fd, 15000, $eol))); +fseek($fd, 1, SEEK_SET); +var_dump(strlen(stream_get_line($fd, 15000, $eol))); +var_dump(strlen(stream_get_line($fd, 15000, $eol))); +?> +--EXPECT-- +int(14000) +int(14000) +int(13999) +int(14000) diff --git a/main/streams/streams.c b/main/streams/streams.c index 40989bbde8..15b3994788 100755 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -551,16 +551,16 @@ static void php_stream_fill_read_buffer(php_stream *stream, size_t size TSRMLS_D efree(chunk_buf); } else { /* Unfiltered Binary stream */ + /* reduce buffer memory consumption if possible, to avoid a realloc */ + if (stream->readbuf.s && stream->readbuflen - stream->writepos < stream->chunk_size) { + memmove(stream->readbuf.s, stream->readbuf.s + stream->readpos, stream->writepos - stream->readpos); + stream->writepos -= stream->readpos; + stream->readpos = 0; + } /* is there enough data in the buffer ? */ - if (stream->writepos - stream->readpos < (off_t)size) { + while (stream->writepos - stream->readpos < (off_t)size) { size_t justread = 0; - - /* reduce buffer memory consumption if possible, to avoid a realloc */ - if (stream->readbuf.s && stream->readbuflen - stream->writepos < stream->chunk_size) { - memmove(stream->readbuf.s, stream->readbuf.s + stream->readpos, stream->writepos - stream->readpos); - stream->writepos -= stream->readpos; - stream->readpos = 0; - } + size_t toread; /* grow the buffer if required * TODO: this can fail for persistent streams */ @@ -569,10 +569,15 @@ static void php_stream_fill_read_buffer(php_stream *stream, size_t size TSRMLS_D stream->readbuf.s = (char*)perealloc(stream->readbuf.s, stream->readbuflen, stream->is_persistent); } - justread = stream->ops->read(stream, stream->readbuf.s + stream->writepos, stream->readbuflen - stream->writepos TSRMLS_CC); - if (justread != (size_t)-1 && justread != 0) { + toread = stream->readbuflen - stream->writepos; + justread = stream->ops->read(stream, stream->readbuf.s + stream->writepos, toread TSRMLS_CC); + + if (justread != (size_t)-1) { stream->writepos += justread; } + if (stream->eof || justread != toread) { + break; + } } } }