aboutsummaryrefslogtreecommitdiff
path: root/src
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:16 +1300
commit6b6901a26f5683d30e6a3192d5b3a7da1dba69c3 (patch)
tree20d9c2a38b320ef0eda3c4a1162aad9b0aa0b8e4 /src
parent70a7a37610f70f546ea651021c970f7d0c4b81b3 (diff)
downloadpostgresql-6b6901a26f5683d30e6a3192d5b3a7da1dba69c3.tar.gz
postgresql-6b6901a26f5683d30e6a3192d5b3a7da1dba69c3.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
Diffstat (limited to 'src')
-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 ad866a76024..c58448f3176 100644
--- a/src/bin/pg_basebackup/receivelog.c
+++ b/src/bin/pg_basebackup/receivelog.c
@@ -191,7 +191,7 @@ static bool
close_walfile(StreamCtl *stream, XLogRecPtr pos)
{
char *fn;
- 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 602727f4d43..6204ba8aba7 100644
--- a/src/bin/pg_basebackup/walmethods.c
+++ b/src/bin/pg_basebackup/walmethods.c
@@ -63,7 +63,7 @@ static DirectoryMethodData *dir_data = NULL;
typedef struct DirectoryMethodFile
{
int fd;
- off_t currpos;
+ pgoff_t currpos;
char *pathname;
char *fullpath;
char *temp_suffix;
@@ -370,7 +370,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);
@@ -666,8 +666,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;
@@ -1005,7 +1005,7 @@ tar_compression_algorithm(void)
return tar_data->compression_algorithm;
}
-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 76530dc9419..240e3f22fc8 100644
--- a/src/bin/pg_basebackup/walmethods.h
+++ b/src/bin/pg_basebackup/walmethods.h
@@ -69,7 +69,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.