Code improvements for ALTER SYSTEM .. SET.
authorRobert Haas <rhaas@postgresql.org>
Mon, 13 Jan 2014 19:54:00 +0000 (14:54 -0500)
committerRobert Haas <rhaas@postgresql.org>
Mon, 13 Jan 2014 19:54:00 +0000 (14:54 -0500)
Move FreeConfigVariables() later to make sure ErrorConfFile is valid
when we use it, and get rid of an unnecessary string copy operation.

Amit Kapila, kibitzed by me.

src/backend/utils/misc/guc-file.l

index c452a0ac0dc938f1879a6a232bf4867582190de0..ec9e0322021b87fbeed9fa2c29eb1b0d3f3a76c1 100644 (file)
@@ -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);
 }
 
 /*