Fix off_t overflow in pg_basebackup on Windows.
authorThomas Munro <tmunro@postgresql.org>
Thu, 9 Jan 2025 00:17:36 +0000 (13:17 +1300)
committerThomas Munro <tmunro@postgresql.org>
Thu, 9 Jan 2025 03:05:16 +0000 (16:05 +1300)
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

src/bin/pg_basebackup/receivelog.c
src/bin/pg_basebackup/walmethods.c
src/bin/pg_basebackup/walmethods.h

index ad866a76024d44fc8b4721ded555aede47e53264..c58448f3176655add96d0c1654029f28b9aa5589 100644 (file)
@@ -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)
index 602727f4d4324d60bd954162e18354977a85ead7..6204ba8aba77d197b00398959634f45e1806bd5c 100644 (file)
@@ -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);
index 76530dc9419c5d811887971c4a533f0c1a609262..240e3f22fc86cf773ef8b9ae121e39b168c0ddf6 100644 (file)
@@ -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.