Introduce variables for initial and max nesting depth on configuration files
authorMichael Paquier <michael@paquier.xyz>
Thu, 24 Nov 2022 22:40:12 +0000 (07:40 +0900)
committerMichael Paquier <michael@paquier.xyz>
Thu, 24 Nov 2022 22:40:12 +0000 (07:40 +0900)
The code has been assuming already in a few places that the initial
recursion nesting depth is 0, and the recent changes in hba.c (mainly
783e8c6) have relies on this assumption in more places.  The maximum
recursion nesting level is assumed to be 10 for hba.c and GUCs.

Author: Julien Rouhaud
Discussion: https://postgr.es/m/20221124090724.n7amf5kpdhx6vb76@jrouhaud

src/backend/commands/extension.c
src/backend/libpq/hba.c
src/backend/utils/misc/guc-file.l
src/backend/utils/misc/guc.c
src/include/utils/conffiles.h

index 806d6056ab6f2d0c24d16b4e1ded687b3dd1061d..cf1b1ca5716662c60767e7b484bf3cc84186fe2e 100644 (file)
@@ -60,6 +60,7 @@
 #include "tcop/utility.h"
 #include "utils/acl.h"
 #include "utils/builtins.h"
+#include "utils/conffiles.h"
 #include "utils/fmgroids.h"
 #include "utils/lsyscache.h"
 #include "utils/memutils.h"
@@ -515,7 +516,8 @@ parse_extension_control_file(ExtensionControlFile *control,
         * Parse the file content, using GUC's file parsing code.  We need not
         * check the return value since any errors will be thrown at ERROR level.
         */
-       (void) ParseConfigFp(file, filename, 0, ERROR, &head, &tail);
+       (void) ParseConfigFp(file, filename, CONF_FILE_START_DEPTH, ERROR,
+                                                &head, &tail);
 
        FreeFile(file);
 
index 862ec18e913a2d9382de305ba47070be904ece4d..95677c48e439908e2c85779d6f7673eafc037d9c 100644 (file)
@@ -79,7 +79,7 @@ typedef struct
 /*
  * Memory context holding the list of TokenizedAuthLines when parsing
  * HBA or ident configuration files.  This is created when opening the first
- * file (depth of 0).
+ * file (depth of CONF_FILE_START_DEPTH).
  */
 static MemoryContext tokenize_context = NULL;
 
@@ -620,7 +620,7 @@ free_auth_file(FILE *file, int depth)
        FreeFile(file);
 
        /* If this is the last cleanup, remove the tokenization context */
-       if (depth == 0)
+       if (depth == CONF_FILE_START_DEPTH)
        {
                MemoryContextDelete(tokenize_context);
                tokenize_context = NULL;
@@ -650,7 +650,7 @@ open_auth_file(const char *filename, int elevel, int depth,
         * avoid dumping core due to stack overflow if an include file loops back
         * to itself.  The maximum nesting depth is pretty arbitrary.
         */
-       if (depth > 10)
+       if (depth > CONF_FILE_MAX_DEPTH)
        {
                ereport(elevel,
                                (errcode_for_file_access(),
@@ -684,7 +684,7 @@ open_auth_file(const char *filename, int elevel, int depth,
         * tokenization.  This will be closed with this file when coming back to
         * this level of cleanup.
         */
-       if (depth == 0)
+       if (depth == CONF_FILE_START_DEPTH)
        {
                /*
                 * A context may be present, but assume that it has been eliminated
@@ -762,7 +762,7 @@ tokenize_auth_file(const char *filename, FILE *file, List **tok_lines,
 
        initStringInfo(&buf);
 
-       if (depth == 0)
+       if (depth == CONF_FILE_START_DEPTH)
                *tok_lines = NIL;
 
        while (!feof(file) && !ferror(file))
index 88245475d1c8c836f10efbaaabb8a85905278e08..f7e4457dedcb38107dd99844e332d367e84b9141 100644 (file)
@@ -202,7 +202,7 @@ ParseConfigFile(const char *config_file, bool strict,
         * avoid dumping core due to stack overflow if an include file loops back
         * to itself.  The maximum nesting depth is pretty arbitrary.
         */
-       if (depth > 10)
+       if (depth > CONF_FILE_MAX_DEPTH)
        {
                ereport(elevel,
                                (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
@@ -321,7 +321,8 @@ GUC_flex_fatal(const char *msg)
  * Input parameters:
  *     fp: file pointer from AllocateFile for the configuration file to parse
  *     config_file: absolute or relative path name of the configuration file
- *     depth: recursion depth (should be 0 in the outermost call)
+ *     depth: recursion depth (should be CONF_FILE_START_DEPTH in the outermost
+ *     call)
  *     elevel: error logging level to use
  * Input/Output parameters:
  *     head_p, tail_p: head and tail of linked list of name/value pairs
index 117a2d26a0e9fa05bfce876ca170c53f41e409c7..28313b3a94ac8ff72aa135cea73cadb89e6396cb 100644 (file)
@@ -44,6 +44,7 @@
 #include "utils/acl.h"
 #include "utils/backend_status.h"
 #include "utils/builtins.h"
+#include "utils/conffiles.h"
 #include "utils/float.h"
 #include "utils/guc_tables.h"
 #include "utils/memutils.h"
@@ -287,7 +288,7 @@ ProcessConfigFileInternal(GucContext context, bool applySettings, int elevel)
        head = tail = NULL;
 
        if (!ParseConfigFile(ConfigFileName, true,
-                                                NULL, 0, 0, elevel,
+                                                NULL, 0, CONF_FILE_START_DEPTH, elevel,
                                                 &head, &tail))
        {
                /* Syntax error(s) detected in the file, so bail out */
@@ -304,7 +305,7 @@ ProcessConfigFileInternal(GucContext context, bool applySettings, int elevel)
        if (DataDir)
        {
                if (!ParseConfigFile(PG_AUTOCONF_FILENAME, false,
-                                                        NULL, 0, 0, elevel,
+                                                        NULL, 0, CONF_FILE_START_DEPTH, elevel,
                                                         &head, &tail))
                {
                        /* Syntax error(s) detected in the file, so bail out */
@@ -4582,7 +4583,8 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt)
                                                                AutoConfFileName)));
 
                        /* parse it */
-                       if (!ParseConfigFp(infile, AutoConfFileName, 0, LOG, &head, &tail))
+                       if (!ParseConfigFp(infile, AutoConfFileName, CONF_FILE_START_DEPTH,
+                                                          LOG, &head, &tail))
                                ereport(ERROR,
                                                (errcode(ERRCODE_CONFIG_FILE_ERROR),
                                                 errmsg("could not parse contents of file \"%s\"",
index 3f23a2a011bef4df144f0c55d077b9c90f05becb..f4d73f96b2ffbcc02b02cdc115b0c4520203befd 100644 (file)
 #ifndef CONFFILES_H
 #define CONFFILES_H
 
+/* recursion nesting depth for configuration files */
+#define CONF_FILE_START_DEPTH  0
+#define CONF_FILE_MAX_DEPTH            10
+
 extern char *AbsoluteConfigLocation(const char *location,
                                                                        const char *calling_file);
 extern char **GetConfFilesInDir(const char *includedir,