From 46d2ab10897626fd3d22282713e67e38945f2d60 Mon Sep 17 00:00:00 2001
From: Robert Haas <rhaas@postgresql.org>
Date: Wed, 30 Oct 2024 15:02:38 -0400
Subject: [PATCH v1 1/2] pg_combinebackup: When reconstructing, avoid double
 slash in filename.

This function is always called with a relative_path that ends in a
slash, so there's no need to insert a second one. So, don't. Instead,
add an assertion to verify that nothing gets broken in the future, and
adjust the comments.
---
 src/bin/pg_combinebackup/reconstruct.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/bin/pg_combinebackup/reconstruct.c b/src/bin/pg_combinebackup/reconstruct.c
index db3f968d271..ae8a5125263 100644
--- a/src/bin/pg_combinebackup/reconstruct.c
+++ b/src/bin/pg_combinebackup/reconstruct.c
@@ -77,8 +77,9 @@ static void read_block(rfile *s, off_t off, uint8 *buffer);
  *
  * relative_path should be the path to the directory containing this file,
  * relative to the root of the backup (NOT relative to the root of the
- * tablespace). bare_file_name should be the name of the file within that
- * directory, without "INCREMENTAL.".
+ * tablespace). It must always end with a trailing slash. bare_file_name
+ * should be the name of the file within that directory, without
+ * "INCREMENTAL.".
  *
  * n_prior_backups is the number of prior backups, and prior_backup_dirs is
  * an array of pathnames where those backups can be found.
@@ -111,6 +112,10 @@ reconstruct_from_incremental_file(char *input_filename,
 	rfile	   *copy_source = NULL;
 	pg_checksum_context checksum_ctx;
 
+	/* Sanity check the relative_path. */
+	Assert(relative_path[0] != '\0');
+	Assert(relative_path[strlen(relative_path) - 1] == '/');
+
 	/*
 	 * Every block must come either from the latest version of the file or
 	 * from one of the prior backups.
@@ -174,11 +179,11 @@ reconstruct_from_incremental_file(char *input_filename,
 		 * Look for the full file in the previous backup. If not found, then
 		 * look for an incremental file instead.
 		 */
-		snprintf(source_filename, MAXPGPATH, "%s/%s/%s",
+		snprintf(source_filename, MAXPGPATH, "%s/%s%s",
 				 prior_backup_dirs[sidx], relative_path, bare_file_name);
 		if ((s = make_rfile(source_filename, true)) == NULL)
 		{
-			snprintf(source_filename, MAXPGPATH, "%s/%s/INCREMENTAL.%s",
+			snprintf(source_filename, MAXPGPATH, "%s/%sINCREMENTAL.%s",
 					 prior_backup_dirs[sidx], relative_path, bare_file_name);
 			s = make_incremental_rfile(source_filename);
 		}
-- 
2.39.3 (Apple Git-145)

