postgres.git / summary / log / commit / refs

commit    6ccfc44922123d497501a491b8becfca7b0096bb
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Sun Mar 22 22:06:48 2026 +0000
First released in: 15.18, 16.14, 17.10, 18.4

    Fix finalization of decompressor astreamers.
    
    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 | 9 +++++---- src/bin/pg_basebackup/bbstreamer_lz4.c | 9 +++++---- src/bin/pg_basebackup/bbstreamer_zstd.c | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/bin/pg_basebackup/bbstreamer_gzip.c b/src/bin/pg_basebackup/bbstreamer_gzip.c index 698c9009ba1..d0fa38610c1 100644 --- a/src/bin/pg_basebackup/bbstreamer_gzip.c +++ b/src/bin/pg_basebackup/bbstreamer_gzip.c @@ -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); } diff --git a/src/bin/pg_basebackup/bbstreamer_lz4.c b/src/bin/pg_basebackup/bbstreamer_lz4.c index b86058b1243..8a92be0d19c 100644 --- a/src/bin/pg_basebackup/bbstreamer_lz4.c +++ b/src/bin/pg_basebackup/bbstreamer_lz4.c @@ -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); } diff --git a/src/bin/pg_basebackup/bbstreamer_zstd.c b/src/bin/pg_basebackup/bbstreamer_zstd.c index 6bccbf59d6f..68af87eb3bf 100644 --- a/src/bin/pg_basebackup/bbstreamer_zstd.c +++ b/src/bin/pg_basebackup/bbstreamer_zstd.c @@ -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); [parent: 876fa84a275e]