From: Thomas Munro Date: Thu, 9 Jan 2025 00:17:36 +0000 (+1300) Subject: Fix off_t overflow in pg_basebackup on Windows. X-Git-Tag: REL_14_16~43 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8f40d46126a04105ff0aa8353ec62c3c7d31af60;p=thirdparty%2Fpostgresql.git 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 Reported-by: Jakub Wartak Discussion: https://postgr.es/m/CAKZiRmyM4YnokK6Oenw5JKwAQ3rhP0YTz2T-tiw5dAQjGRXE3Q%40mail.gmail.com --- 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.