cellog Mon Sep 22 01:25:44 2008 UTC Modified files: (Branch: PHP_5_2) /php-src NEWS /php-src/main/streams filter.c streams.c Log: fix Bug #46147: after stream seek, appending stream filter reads incorrect data http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.1229&r2=1.2027.2.547.2.1230&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.547.2.1229 php-src/NEWS:1.2027.2.547.2.1230 --- php-src/NEWS:1.2027.2.547.2.1229 Sat Sep 20 22:12:59 2008 +++ php-src/NEWS Mon Sep 22 01:25:44 2008 @@ -18,6 +18,8 @@ (Scott) - Fixed a crash on invalid method in ReflectionParameter constructor. (Christian Seiler) +- Fixed Bug #46147 (after stream seek, appending stream filter reads incorrect data). + (Greg) - Fixed bug #46059 (Compile failure under IRIX 6.5.30 building posix.c). (Arnaud) - Fixed bug #46053 (SplFileObject::seek - Endless loop). (Arnaud) http://cvs.php.net/viewvc.cgi/php-src/main/streams/filter.c?r1=1.17.2.3.2.11&r2=1.17.2.3.2.12&diff_format=u Index: php-src/main/streams/filter.c diff -u php-src/main/streams/filter.c:1.17.2.3.2.11 php-src/main/streams/filter.c:1.17.2.3.2.12 --- php-src/main/streams/filter.c:1.17.2.3.2.11 Mon Dec 31 07:20:15 2007 +++ php-src/main/streams/filter.c Mon Sep 22 01:25:44 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: filter.c,v 1.17.2.3.2.11 2007/12/31 07:20:15 sebastian Exp $ */ +/* $Id: filter.c,v 1.17.2.3.2.12 2008/09/22 01:25:44 cellog Exp $ */ #include "php.h" #include "php_globals.h" @@ -381,15 +381,12 @@ stream->writepos = 0; break; case PSFS_PASS_ON: - /* Put any filtered data onto the readbuffer stack. - Previously read data has been at least partially consumed. */ - stream->readpos += consumed; - - if (stream->writepos == stream->readpos) { - /* Entirely consumed */ - stream->writepos = 0; - stream->readpos = 0; - } + /* If any data is consumed, we cannot rely upon the existing read buffer, + as the filtered data must replace the existing data, so invalidate the cache */ + /* note that changes here should be reflected in + main/streams/streams.c::php_stream_fill_read_buffer */ + stream->writepos = 0; + stream->readpos = 0; while (brig_outp->head) { bucket = brig_outp->head; http://cvs.php.net/viewvc.cgi/php-src/main/streams/streams.c?r1=1.82.2.6.2.25&r2=1.82.2.6.2.26&diff_format=u Index: php-src/main/streams/streams.c diff -u php-src/main/streams/streams.c:1.82.2.6.2.25 php-src/main/streams/streams.c:1.82.2.6.2.26 --- php-src/main/streams/streams.c:1.82.2.6.2.25 Wed Aug 27 07:48:37 2008 +++ php-src/main/streams/streams.c Mon Sep 22 01:25:44 2008 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: streams.c,v 1.82.2.6.2.25 2008/08/27 07:48:37 dsp Exp $ */ +/* $Id: streams.c,v 1.82.2.6.2.26 2008/09/22 01:25:44 cellog Exp $ */ #define _GNU_SOURCE #include "php.h" @@ -438,6 +438,10 @@ 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);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php