v3-0004-Fix-issues-with-reading-zero-bytes-in-Gzip_read-a.patch
text/x-diff
Filename: v3-0004-Fix-issues-with-reading-zero-bytes-in-Gzip_read-a.patch
Type: text/x-diff
Part: 3
Patch
Format: format-patch
Series: patch v3-0004
Subject: Fix issues with reading zero bytes in Gzip_read and Zstd_read.
| File | + | − |
|---|---|---|
| src/bin/pg_dump/compress_gzip.c | 4 | 0 |
| src/bin/pg_dump/compress_zstd.c | 1 | 4 |
From 6e65ac1ff26071024cfcf24d15819aa6b72af137 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sat, 11 Oct 2025 21:16:12 -0400
Subject: [PATCH v3 4/4] Fix issues with reading zero bytes in Gzip_read and
Zstd_read.
pg_dump expects a read request of zero bytes to be a no-op
(see for example ReadStr()). Gzip_read got this wrong and
falsely supposed that the resulting gzret == 0 indicated
an error. Zstd_read got the right result, but only after
doing a lot more work than necessary, because it checked at
the bottom of the loop not the top.
The Gzip_read fix perhaps should be back-patched, because
it breaks the nominally-supported case of manually gzip'ing
the toc.dat file within a directory-style dump.
Author: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/3515357.1760128017@sss.pgh.pa.us
---
src/bin/pg_dump/compress_gzip.c | 4 ++++
src/bin/pg_dump/compress_zstd.c | 5 +----
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/bin/pg_dump/compress_gzip.c b/src/bin/pg_dump/compress_gzip.c
index 4a067e1402c..ad3b6486027 100644
--- a/src/bin/pg_dump/compress_gzip.c
+++ b/src/bin/pg_dump/compress_gzip.c
@@ -257,6 +257,10 @@ Gzip_read(void *ptr, size_t size, CompressFileHandle *CFH)
gzFile gzfp = (gzFile) CFH->private_data;
int gzret;
+ /* Reading zero bytes must be a no-op */
+ if (size == 0)
+ return 0;
+
gzret = gzread(gzfp, ptr, size);
/*
diff --git a/src/bin/pg_dump/compress_zstd.c b/src/bin/pg_dump/compress_zstd.c
index 5fe2279faae..36c1fd264ee 100644
--- a/src/bin/pg_dump/compress_zstd.c
+++ b/src/bin/pg_dump/compress_zstd.c
@@ -287,7 +287,7 @@ Zstd_read_internal(void *ptr, size_t size, CompressFileHandle *CFH, bool exit_on
output->dst = ptr;
output->pos = 0;
- for (;;)
+ while (output->pos < output->size)
{
Assert(input->pos <= input->size);
Assert(input->size <= input_allocated_size);
@@ -341,9 +341,6 @@ Zstd_read_internal(void *ptr, size_t size, CompressFileHandle *CFH, bool exit_on
if (res == 0)
break; /* End of frame */
}
-
- if (output->pos == output->size)
- break; /* We read all the data that fits */
}
return output->pos;
--
2.43.7