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