Thread

  1. [PATCH v22 1/2] Introduce macros for initial/maximum depth levels for configuration files

    Julien Rouhaud <julien.rouhaud@free.fr> — 2022-11-24T08:57:53Z

    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
    
    
    --vrovnvq7lnrsceg7
    Content-Type: text/plain; charset=us-ascii
    Content-Disposition: attachment;
    	filename="v22-0002-Add-regression-tests-for-file-inclusion-in-HBA-e.patch"