]> 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 a56ce6fd57521d50b25a662090d88b2b24748096..71a5fa7874ac10b1a04116ee35fe4333483b61b2 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 e00cffec0b94c79fbb46b039c18277b6358b020a..d08caf2809d3d80a1788a35c5f4df3a73b76cafb 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 3649a070aadecae9c0e80e25b833ff4c758bbedd..24c9ec2ed602fb5e483cb502408cf098556d035e 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);