Create memory context for tokenization after opening top-level file in hba.c
authorMichael Paquier <michael@paquier.xyz>
Thu, 24 Nov 2022 01:27:38 +0000 (10:27 +0900)
committerMichael Paquier <michael@paquier.xyz>
Thu, 24 Nov 2022 01:27:38 +0000 (10:27 +0900)
The memory context was created before attempting to open the first HBA
or ident file, which would cause it to leak.  This had no consequences
for the system views for HBA and ident files, but this would cause
memory leaks in the postmaster on reload if the initial HBA and/or ident
files are missing, which is a valid behavior while the backend is
running.

Oversight in efc9816.

Author: Ted Yu
Discussion: https://postgr.es/m/CALte62xH6ivgiKKzPRJgfekPZC6FKLB3xbnf3=tZmc_gKj78dw@mail.gmail.com

src/backend/libpq/hba.c

index d6254d820fbd7a5021adec1f497e4b798ff7a302..1bd151c94160fb5d24ee058442112a4c51c850e0 100644 (file)
@@ -601,22 +601,6 @@ open_auth_file(const char *filename, int elevel, int depth,
        return NULL;
    }
 
-   /*
-    * When opening the top-level file, create the memory context used for the
-    * tokenization.  This will be closed with this file when coming back to
-    * this level of cleanup.
-    */
-   if (depth == 0)
-   {
-       /*
-        * A context may be present, but assume that it has been eliminated
-        * already.
-        */
-       tokenize_context = AllocSetContextCreate(CurrentMemoryContext,
-                                                "tokenize_context",
-                                                ALLOCSET_START_SMALL_SIZES);
-   }
-
    file = AllocateFile(filename, "r");
    if (file == NULL)
    {
@@ -634,6 +618,22 @@ open_auth_file(const char *filename, int elevel, int depth,
        return NULL;
    }
 
+   /*
+    * When opening the top-level file, create the memory context used for the
+    * tokenization.  This will be closed with this file when coming back to
+    * this level of cleanup.
+    */
+   if (depth == 0)
+   {
+       /*
+        * A context may be present, but assume that it has been eliminated
+        * already.
+        */
+       tokenize_context = AllocSetContextCreate(CurrentMemoryContext,
+                                                "tokenize_context",
+                                                ALLOCSET_START_SMALL_SIZES);
+   }
+
    return file;
 }