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);
 }
 
 /*