]> 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 4bfb9e77b9b2282bea43280409f6ba0a59507aaf..40caf8f94cba0674eb05df69a544c40358bbb595 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 043bbb0cfe16d882780966751ca0047b3e6142a1..a914bfa5c1ee4aa0fe1963ef9539a992428a7d23 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 02f5db77c2dcab01c5380c191779700cae2ab9af..1671e03699af5ffac35cfb5561861d787e79ce76 100644 (file)
@@ -333,7 +333,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);