]> granicus.if.org Git - php/commitdiff
MF52 fix Bug #46147: after stream seek, appending stream filter reads incorrect data
authorGreg Beaver <cellog@php.net>
Mon, 22 Sep 2008 01:26:38 +0000 (01:26 +0000)
committerGreg Beaver <cellog@php.net>
Mon, 22 Sep 2008 01:26:38 +0000 (01:26 +0000)
main/streams/filter.c
main/streams/streams.c

index 03e9974f7c41e66e55b10d9842e6f19593433195..960df4c6789e01a59a7558c3a0584aec078c370f 100644 (file)
@@ -461,15 +461,12 @@ PHPAPI void _php_stream_filter_append(php_stream_filter_chain *chain, php_stream
                                stream->readpos = 0;
                                stream->writepos = 0;
                        } else if (status == 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;
index 8ca087727addd070e33dc419e3712184b0ef43e8..a2cbe888bbbef93bf27f9631c56aa77e765a46ff 100755 (executable)
@@ -455,6 +455,10 @@ 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);