]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
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:25 +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 682081b4310194626bab57c0086a4539a069c547..73620e0daf33c1b429ce308a8629978cd71b4748 100644 (file)
@@ -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)
index e91eb8f42ff1c5fb680080eac112fa9747a17b17..bc214dd4250f0d9289f7ed0c2f7789e4f9411639 100644 (file)
@@ -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);
index 4abdfd8333fcd6734ab19e0dac289a39c57cc10a..b15a24bcacab191953899a0b38cc234dfd438fa9 100644 (file)
@@ -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.