From 8f40d46126a04105ff0aa8353ec62c3c7d31af60 Mon Sep 17 00:00:00 2001
From: Thomas Munro <tmunro@postgresql.org>
Date: Thu, 9 Jan 2025 13:17:36 +1300
Subject: [PATCH] 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
---
 src/bin/pg_basebackup/receivelog.c |  2 +-
 src/bin/pg_basebackup/walmethods.c | 10 +++++-----
 src/bin/pg_basebackup/walmethods.h |  2 +-
 3 files changed, 7 insertions(+), 7 deletions(-)

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.
-- 
2.39.5