From 553d45826e1ec71ffd2a1d4bb4104d948cf8844d Mon Sep 17 00:00:00 2001
From: Aleksander Alekseev <aleksander@timescale.com>
Date: Wed, 13 Aug 2025 22:26:13 +0300
Subject: [PATCH v2] Fix memory leaks in SelectConfigFiles()

Make sure the memory allocated by make_absolute_path() is freed when
SelectConfigFiles() fails. It's mainly to silence Valgrind. The callers
exit() rapidly in such cases and no memory actually leaks.

Author: Aleksander Alekseev <aleksander@tigerdata.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/CAJ7c6TMByXE8dc7zDvDWTQjk6o-XXAdRg_RAg5CBaUOgFPV3LQ%40mail.gmail.com
---
 src/backend/utils/misc/guc.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index e404c345e6e..46fdefebe35 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -1803,7 +1803,7 @@ SelectConfigFiles(const char *userDoption, const char *progname)
 					 configdir);
 		if (errno == ENOENT)
 			write_stderr("Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n");
-		return false;
+		goto fail;
 	}
 
 	/*
@@ -1830,7 +1830,7 @@ SelectConfigFiles(const char *userDoption, const char *progname)
 					 "You must specify the --config-file or -D invocation "
 					 "option or set the PGDATA environment variable.\n",
 					 progname);
-		return false;
+		goto fail;
 	}
 
 	/*
@@ -1851,8 +1851,7 @@ SelectConfigFiles(const char *userDoption, const char *progname)
 	{
 		write_stderr("%s: could not access the server configuration file \"%s\": %m\n",
 					 progname, ConfigFileName);
-		free(configdir);
-		return false;
+		goto fail;
 	}
 
 	/*
@@ -1882,7 +1881,7 @@ SelectConfigFiles(const char *userDoption, const char *progname)
 					 "or by the -D invocation option, or by the "
 					 "PGDATA environment variable.\n",
 					 progname, ConfigFileName);
-		return false;
+		goto fail;
 	}
 
 	/*
@@ -1934,7 +1933,7 @@ SelectConfigFiles(const char *userDoption, const char *progname)
 					 "or by the -D invocation option, or by the "
 					 "PGDATA environment variable.\n",
 					 progname, ConfigFileName);
-		return false;
+		goto fail;
 	}
 	SetConfigOption("hba_file", fname, PGC_POSTMASTER, PGC_S_OVERRIDE);
 
@@ -1965,7 +1964,7 @@ SelectConfigFiles(const char *userDoption, const char *progname)
 					 "or by the -D invocation option, or by the "
 					 "PGDATA environment variable.\n",
 					 progname, ConfigFileName);
-		return false;
+		goto fail;
 	}
 	SetConfigOption("ident_file", fname, PGC_POSTMASTER, PGC_S_OVERRIDE);
 
@@ -1977,6 +1976,11 @@ SelectConfigFiles(const char *userDoption, const char *progname)
 	free(configdir);
 
 	return true;
+
+fail:
+	free(configdir);
+
+	return false;
 }
 
 /*
-- 
2.43.0

