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:
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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.
|
||||||
|
Reference in New Issue
Block a user