mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +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 @@ open_walfile(StreamCtl *stream, XLogRecPtr startpoint)
 | 
				
			|||||||
static bool
 | 
					static bool
 | 
				
			||||||
close_walfile(StreamCtl *stream, XLogRecPtr pos)
 | 
					close_walfile(StreamCtl *stream, XLogRecPtr pos)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	off_t		currpos;
 | 
						pgoff_t		currpos;
 | 
				
			||||||
	int			r;
 | 
						int			r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (walfile == NULL)
 | 
						if (walfile == NULL)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -55,7 +55,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;
 | 
				
			||||||
@@ -241,7 +241,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);
 | 
				
			||||||
@@ -468,8 +468,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[512];
 | 
						char		header[512];
 | 
				
			||||||
	char	   *pathname;
 | 
						char	   *pathname;
 | 
				
			||||||
	size_t		pad_to_size;
 | 
						size_t		pad_to_size;
 | 
				
			||||||
@@ -799,7 +799,7 @@ tar_compression(void)
 | 
				
			|||||||
	return tar_data->compression;
 | 
						return tar_data->compression;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static off_t
 | 
					static pgoff_t
 | 
				
			||||||
tar_get_current_pos(Walfile f)
 | 
					tar_get_current_pos(Walfile f)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Assert(f != NULL);
 | 
						Assert(f != NULL);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -68,7 +68,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