]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix finalization of decompressor astreamers.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 22 Mar 2026 22:06:48 +0000 (18:06 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 22 Mar 2026 22:06:48 +0000 (18:06 -0400)
Send the correct amount of data to the next astreamer, not the
whole allocated buffer size.  This bug escaped detection because
in present uses the next astreamer is always a tar-file parser
which is insensitive to trailing garbage.  But that may not
be true in future uses.

Author: Andrew Dunstan <andrew@dunslane.net>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/2178517.1774064942@sss.pgh.pa.us
Backpatch-through: 15

src/fe_utils/astreamer_gzip.c
src/fe_utils/astreamer_lz4.c
src/fe_utils/astreamer_zstd.c

index 2e080c37a5854aefbde9e986c5c9b397d024b702..df392f67cab4706708e9fcc5cca3ad4a5f8f9c9f 100644 (file)
@@ -347,10 +347,11 @@ astreamer_gzip_decompressor_finalize(astreamer *streamer)
         * End of the stream, if there is some pending data in output buffers then
         * we must forward it to next streamer.
         */
-       astreamer_content(mystreamer->base.bbs_next, NULL,
-                                         mystreamer->base.bbs_buffer.data,
-                                         mystreamer->base.bbs_buffer.maxlen,
-                                         ASTREAMER_UNKNOWN);
+       if (mystreamer->bytes_written > 0)
+               astreamer_content(mystreamer->base.bbs_next, NULL,
+                                                 mystreamer->base.bbs_buffer.data,
+                                                 mystreamer->bytes_written,
+                                                 ASTREAMER_UNKNOWN);
 
        astreamer_finalize(mystreamer->base.bbs_next);
 }
index 2bc32b42879b0e58d5b9a19a53869cd0d3b871ae..605c188007b05a8202544176d6c809733b040fb5 100644 (file)
@@ -397,10 +397,11 @@ astreamer_lz4_decompressor_finalize(astreamer *streamer)
         * End of the stream, if there is some pending data in output buffers then
         * we must forward it to next streamer.
         */
-       astreamer_content(mystreamer->base.bbs_next, NULL,
-                                         mystreamer->base.bbs_buffer.data,
-                                         mystreamer->base.bbs_buffer.maxlen,
-                                         ASTREAMER_UNKNOWN);
+       if (mystreamer->bytes_written > 0)
+               astreamer_content(mystreamer->base.bbs_next, NULL,
+                                                 mystreamer->base.bbs_buffer.data,
+                                                 mystreamer->bytes_written,
+                                                 ASTREAMER_UNKNOWN);
 
        astreamer_finalize(mystreamer->base.bbs_next);
 }
index f26abcfd0fa5d0bf680d4a7f9c9f67516a2aaffd..4b43ab795e31afa8e71a763776cb619bf935654e 100644 (file)
@@ -347,7 +347,7 @@ astreamer_zstd_decompressor_finalize(astreamer *streamer)
        if (mystreamer->zstd_outBuf.pos > 0)
                astreamer_content(mystreamer->base.bbs_next, NULL,
                                                  mystreamer->base.bbs_buffer.data,
-                                                 mystreamer->base.bbs_buffer.maxlen,
+                                                 mystreamer->zstd_outBuf.pos,
                                                  ASTREAMER_UNKNOWN);
 
        astreamer_finalize(mystreamer->base.bbs_next);