aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Munro <tmunro@postgresql.org>2025-01-09 13:17:36 +1300
committerThomas Munro <tmunro@postgresql.org>2025-01-09 16:05:25 +1300
commit8f40d46126a04105ff0aa8353ec62c3c7d31af60 (patch)
tree241653db6e060ab68dc3c133804b17fed39347c5
parent1636c5e56ed72e53127fc4cb0095422d9a0d250a (diff)
downloadpostgresql-8f40d46126a04105ff0aa8353ec62c3c7d31af60.tar.gz
postgresql-8f40d46126a04105ff0aa8353ec62c3c7d31af60.zip
Fix off_t overflow in pg_basebackup on Windows.
walmethods.c used off_t to navigate around a pg_wal.tar file that could exceed 2GB, which doesn't work on Windows and would fail with misleading errors. Use pgoff_t instead. Back-patch to all supported branches. Author: Davinder Singh <davinder.singh@enterprisedb.com> Reported-by: Jakub Wartak <jakub.wartak@enterprisedb.com> Discussion: https://postgr.es/m/CAKZiRmyM4YnokK6Oenw5JKwAQ3rhP0YTz2T-tiw5dAQjGRXE3Q%40mail.gmail.com
-rw-r--r--src/bin/pg_basebackup/receivelog.c2
-rw-r--r--src/bin/pg_basebackup/walmethods.c10
-rw-r--r--src/bin/pg_basebackup/walmethods.h2
3 files changed, 7 insertions, 7 deletions
diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c
index 682081b4310..73620e0daf3 100644
--- a/src/bin/pg_basebackup/receivelog.c
+++ b/src/bin/pg_basebackup/receivelog.c
@@ -190,7 +190,7 @@ open_walfile(StreamCtl *stream, XLogRecPtr startpoint)
static bool
close_walfile(StreamCtl *stream, XLogRecPtr pos)
{
- off_t currpos;
+ pgoff_t currpos;
int r;
if (walfile == NULL)
diff --git a/src/bin/pg_basebackup/walmethods.c b/src/bin/pg_basebackup/walmethods.c
index e91eb8f42ff..bc214dd4250 100644
--- a/src/bin/pg_basebackup/walmethods.c
+++ b/src/bin/pg_basebackup/walmethods.c
@@ -55,7 +55,7 @@ static DirectoryMethodData *dir_data = NULL;
typedef struct DirectoryMethodFile
{
int fd;
- off_t currpos;
+ pgoff_t currpos;
char *pathname;
char *fullpath;
char *temp_suffix;
@@ -241,7 +241,7 @@ dir_write(Walfile f, const void *buf, size_t count)
return r;
}
-static off_t
+static pgoff_t
dir_get_current_pos(Walfile f)
{
Assert(f != NULL);
@@ -468,8 +468,8 @@ FreeWalDirectoryMethod(void)
typedef struct TarMethodFile
{
- off_t ofs_start; /* Where does the *header* for this file start */
- off_t currpos;
+ pgoff_t ofs_start; /* Where does the *header* for this file start */
+ pgoff_t currpos;
char header[TAR_BLOCK_SIZE];
char *pathname;
size_t pad_to_size;
@@ -801,7 +801,7 @@ tar_compression(void)
return tar_data->compression;
}
-static off_t
+static pgoff_t
tar_get_current_pos(Walfile f)
{
Assert(f != NULL);
diff --git a/src/bin/pg_basebackup/walmethods.h b/src/bin/pg_basebackup/walmethods.h
index 4abdfd8333f..b15a24bcaca 100644
--- a/src/bin/pg_basebackup/walmethods.h
+++ b/src/bin/pg_basebackup/walmethods.h
@@ -68,7 +68,7 @@ struct WalWriteMethod
ssize_t (*write) (Walfile f, const void *buf, size_t count);
/* Return the current position in a file or -1 on error */
- off_t (*get_current_pos) (Walfile f);
+ pgoff_t (*get_current_pos) (Walfile f);
/*
* fsync the contents of the specified file. Returns 0 on success.