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
#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"
* 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);
/*
* 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;
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;
* 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(),
* 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
initStringInfo(&buf);
- if (depth == 0)
+ if (depth == CONF_FILE_START_DEPTH)
*tok_lines = NIL;
while (!feof(file) && !ferror(file))
* 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),
* 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
#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"
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 */
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 */
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\"",
#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,