]> 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/bin/pg_basebackup/bbstreamer_gzip.c
src/bin/pg_basebackup/bbstreamer_lz4.c
src/bin/pg_basebackup/bbstreamer_zstd.c

index c62265ac86f9cac5bc8c38a491cfbc344a394d14..94f3b9a4de530f60c5254bbc09d14c326cbef747 100644 (file)
@@ -323,10 +323,11 @@ bbstreamer_gzip_decompressor_finalize(bbstreamer *streamer)
         * End of the stream, if there is some pending data in output buffers then
         * we must forward it to next streamer.
         */
-       bbstreamer_content(mystreamer->base.bbs_next, NULL,
-                                          mystreamer->base.bbs_buffer.data,
-                                          mystreamer->base.bbs_buffer.maxlen,
-                                          BBSTREAMER_UNKNOWN);
+       if (mystreamer->bytes_written > 0)
+               bbstreamer_content(mystreamer->base.bbs_next, NULL,
+                                                  mystreamer->base.bbs_buffer.data,
+                                                  mystreamer->bytes_written,
+                                                  BBSTREAMER_UNKNOWN);
 
        bbstreamer_finalize(mystreamer->base.bbs_next);
 }
index a9f57d56ac0177c623ef8bb36c6a375a4cbf990b..eaed289297d03ff90ea6e1892374b71d8b420a96 100644 (file)
@@ -395,10 +395,11 @@ bbstreamer_lz4_decompressor_finalize(bbstreamer *streamer)
         * End of the stream, if there is some pending data in output buffers then
         * we must forward it to next streamer.
         */
-       bbstreamer_content(mystreamer->base.bbs_next, NULL,
-                                          mystreamer->base.bbs_buffer.data,
-                                          mystreamer->base.bbs_buffer.maxlen,
-                                          BBSTREAMER_UNKNOWN);
+       if (mystreamer->bytes_written > 0)
+               bbstreamer_content(mystreamer->base.bbs_next, NULL,
+                                                  mystreamer->base.bbs_buffer.data,
+                                                  mystreamer->bytes_written,
+                                                  BBSTREAMER_UNKNOWN);
 
        bbstreamer_finalize(mystreamer->base.bbs_next);
 }
index 6e220a2ebd7c3c5dd6f5de71e861b46a0e64de5a..71759ba3ccacc831d4270b56e142b0875c4fe4e1 100644 (file)
@@ -343,7 +343,7 @@ bbstreamer_zstd_decompressor_finalize(bbstreamer *streamer)
        if (mystreamer->zstd_outBuf.pos > 0)
                bbstreamer_content(mystreamer->base.bbs_next, NULL,
                                                   mystreamer->base.bbs_buffer.data,
-                                                  mystreamer->base.bbs_buffer.maxlen,
+                                                  mystreamer->zstd_outBuf.pos,
                                                   BBSTREAMER_UNKNOWN);
 
        bbstreamer_finalize(mystreamer->base.bbs_next);