1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-29 10:41:53 +03:00

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
This commit is contained in:
Thomas Munro
2025-01-09 13:17:36 +13:00
parent 70a7a37610
commit 6b6901a26f
3 changed files with 7 additions and 7 deletions

View File

@ -191,7 +191,7 @@ static bool
close_walfile(StreamCtl *stream, XLogRecPtr pos) close_walfile(StreamCtl *stream, XLogRecPtr pos)
{ {
char *fn; char *fn;
off_t currpos; pgoff_t currpos;
int r; int r;
if (walfile == NULL) if (walfile == NULL)

View File

@ -63,7 +63,7 @@ static DirectoryMethodData *dir_data = NULL;
typedef struct DirectoryMethodFile typedef struct DirectoryMethodFile
{ {
int fd; int fd;
off_t currpos; pgoff_t currpos;
char *pathname; char *pathname;
char *fullpath; char *fullpath;
char *temp_suffix; char *temp_suffix;
@ -370,7 +370,7 @@ dir_write(Walfile f, const void *buf, size_t count)
return r; return r;
} }
static off_t static pgoff_t
dir_get_current_pos(Walfile f) dir_get_current_pos(Walfile f)
{ {
Assert(f != NULL); Assert(f != NULL);
@ -666,8 +666,8 @@ FreeWalDirectoryMethod(void)
typedef struct TarMethodFile typedef struct TarMethodFile
{ {
off_t ofs_start; /* Where does the *header* for this file start */ pgoff_t ofs_start; /* Where does the *header* for this file start */
off_t currpos; pgoff_t currpos;
char header[TAR_BLOCK_SIZE]; char header[TAR_BLOCK_SIZE];
char *pathname; char *pathname;
size_t pad_to_size; size_t pad_to_size;
@ -1005,7 +1005,7 @@ tar_compression_algorithm(void)
return tar_data->compression_algorithm; return tar_data->compression_algorithm;
} }
static off_t static pgoff_t
tar_get_current_pos(Walfile f) tar_get_current_pos(Walfile f)
{ {
Assert(f != NULL); Assert(f != NULL);

View File

@ -69,7 +69,7 @@ struct WalWriteMethod
ssize_t (*write) (Walfile f, const void *buf, size_t count); ssize_t (*write) (Walfile f, const void *buf, size_t count);
/* Return the current position in a file or -1 on error */ /* 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. * fsync the contents of the specified file. Returns 0 on success.