lbarnaud Mon Nov 3 23:28:45 2008 UTC Added files: /php-src/ext/standard/tests/file bug44607.phpt
Modified files: /php-src/main/streams streams.c Log: Fixed bug #44607 (stream_get_line unable to correctly identify the "ending" in the stream content) http://cvs.php.net/viewvc.cgi/php-src/main/streams/streams.c?r1=1.171&r2=1.172&diff_format=u Index: php-src/main/streams/streams.c diff -u php-src/main/streams/streams.c:1.171 php-src/main/streams/streams.c:1.172 --- php-src/main/streams/streams.c:1.171 Mon Nov 3 15:47:05 2008 +++ php-src/main/streams/streams.c Mon Nov 3 23:28:45 2008 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: streams.c,v 1.171 2008/11/03 15:47:05 lbarnaud Exp $ */ +/* $Id: streams.c,v 1.172 2008/11/03 23:28:45 lbarnaud Exp $ */ #define _GNU_SOURCE #include "php.h" @@ -551,16 +551,16 @@ 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 @@ 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; + } } } } http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/file/bug44607.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/file/bug44607.phpt +++ php-src/ext/standard/tests/file/bug44607.phpt --TEST-- Bug #44607 (stream_get_line unable to correctly identify the "ending" in the stream content) --FILE-- <?php $eol = '<EOL>'; $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) -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php