diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l
index c452a0ac0dc938f1879a6a232bf4867582190de0..ec9e0322021b87fbeed9fa2c29eb1b0d3f3a76c1 100644
--- a/src/backend/utils/misc/guc-file.l
+++ b/src/backend/utils/misc/guc-file.l
@@ -120,7 +120,6 @@ ProcessConfigFile(GucContext context)
 				   *head,
 				   *tail;
 	int			i;
-	char		ConfigAutoFileName[MAXPGPATH];
 	char		*ErrorConfFile;
 	char		*CallingFileName;
 
@@ -155,17 +154,16 @@ ProcessConfigFile(GucContext context)
 	 * data directory, however when called during initdb data directory is not
 	 * set till this point, so use ConfigFile path which will be same.
 	 */
-	snprintf(ConfigAutoFileName,sizeof(ConfigAutoFileName),"%s", PG_AUTOCONF_FILENAME);
 	if (data_directory)
 		CallingFileName = NULL;
 	else
 		CallingFileName = ConfigFileName;
 
-	if (!ParseConfigFile(ConfigAutoFileName, CallingFileName, false, 0, elevel, &head, &tail))
+	if (!ParseConfigFile(PG_AUTOCONF_FILENAME, CallingFileName, false, 0, elevel, &head, &tail))
 	{
 		/* Syntax error(s) detected in the file, so bail out */
 		error = true;
-		ErrorConfFile = ConfigAutoFileName;
+		ErrorConfFile = PG_AUTOCONF_FILENAME;
 		goto cleanup_list;
 	}
 
@@ -368,8 +366,6 @@ ProcessConfigFile(GucContext context)
 	PgReloadTime = GetCurrentTimestamp();
 
  cleanup_list:
-	FreeConfigVariables(head);
-
 	if (error)
 	{
 		/* During postmaster startup, any error is fatal */
@@ -389,6 +385,13 @@ ProcessConfigFile(GucContext context)
 					 errmsg("configuration file \"%s\" contains errors; no changes were applied",
 							ErrorConfFile)));
 	}
+
+	/*
+	 * Calling FreeConfigVariables() any earlier than this can cause problems,
+	 * because ErrorConfFile could be pointing to a string that will be freed
+	 * here.
+	 */
+	FreeConfigVariables(head);
 }
 
 /*