From 879cf469d00d9274b67b80eb5fe47dfccf03022d Mon Sep 17 00:00:00 2001 From: Julien Rouhaud Date: Thu, 24 Nov 2022 16:57:53 +0800 Subject: [PATCH v22 1/2] Introduce macros for initial/maximum depth levels for configuration files Author: Julien Rouhaud Reviewed-by: FIXME Discussion: https://postgr.es/m/20220223045959.35ipdsvbxcstrhya@jrouhaud --- src/backend/commands/extension.c | 4 +++- src/backend/libpq/hba.c | 8 ++++---- src/backend/utils/misc/guc-file.l | 5 +++-- src/backend/utils/misc/guc.c | 8 +++++--- src/include/utils/conffiles.h | 3 +++ 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c index 806d6056ab..de01b792b9 100644 --- a/src/backend/commands/extension.c +++ b/src/backend/commands/extension.c @@ -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); diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index 862ec18e91..8f1a0c4c73 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -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)) diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l index 88245475d1..f7e4457ded 100644 --- a/src/backend/utils/misc/guc-file.l +++ b/src/backend/utils/misc/guc-file.l @@ -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 diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 117a2d26a0..28313b3a94 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -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\"", diff --git a/src/include/utils/conffiles.h b/src/include/utils/conffiles.h index 3f23a2a011..294a88c854 100644 --- a/src/include/utils/conffiles.h +++ b/src/include/utils/conffiles.h @@ -13,6 +13,9 @@ #ifndef CONFFILES_H #define CONFFILES_H +#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, -- 2.37.0