diff options
Diffstat (limited to 'src/backend/utils/misc/guc.c')
-rw-r--r-- | src/backend/utils/misc/guc.c | 66 |
1 files changed, 41 insertions, 25 deletions
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 0192def17a5..b87bfb3ff00 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -493,7 +493,7 @@ static bool data_checksums; static int wal_segment_size; static bool integer_datetimes; static int effective_io_concurrency; -static bool assert_enabled; +static bool assert_enabled; /* should be static, but commands/variable.c needs to get at this */ char *role_string; @@ -509,6 +509,7 @@ const char *const GucContext_Names[] = /* PGC_INTERNAL */ "internal", /* PGC_POSTMASTER */ "postmaster", /* PGC_SIGHUP */ "sighup", + /* PGC_SU_BACKEND */ "superuser-backend", /* PGC_BACKEND */ "backend", /* PGC_SUSET */ "superuser", /* PGC_USERSET */ "user" @@ -907,7 +908,7 @@ static struct config_bool ConfigureNamesBool[] = NULL, NULL, NULL }, { - {"log_connections", PGC_BACKEND, LOGGING_WHAT, + {"log_connections", PGC_SU_BACKEND, LOGGING_WHAT, gettext_noop("Logs each successful connection."), NULL }, @@ -916,7 +917,7 @@ static struct config_bool ConfigureNamesBool[] = NULL, NULL, NULL }, { - {"log_disconnections", PGC_BACKEND, LOGGING_WHAT, + {"log_disconnections", PGC_SU_BACKEND, LOGGING_WHAT, gettext_noop("Logs end of a session, including duration."), NULL }, @@ -4389,10 +4390,10 @@ SelectConfigFiles(const char *userDoption, const char *progname) SetConfigOption("data_directory", DataDir, PGC_POSTMASTER, PGC_S_OVERRIDE); /* - * Now read the config file a second time, allowing any settings in - * the PG_AUTOCONF_FILENAME file to take effect. (This is pretty ugly, - * but since we have to determine the DataDir before we can find the - * autoconf file, the alternatives seem worse.) + * Now read the config file a second time, allowing any settings in the + * PG_AUTOCONF_FILENAME file to take effect. (This is pretty ugly, but + * since we have to determine the DataDir before we can find the autoconf + * file, the alternatives seem worse.) */ ProcessConfigFile(PGC_POSTMASTER); @@ -5694,16 +5695,27 @@ set_config_option(const char *name, const char *value, * signals to individual backends only. */ break; + case PGC_SU_BACKEND: + /* Reject if we're connecting but user is not superuser */ + if (context == PGC_BACKEND) + { + ereport(elevel, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied to set parameter \"%s\"", + name))); + return 0; + } + /* FALL THRU to process the same as PGC_BACKEND */ case PGC_BACKEND: if (context == PGC_SIGHUP) { /* - * If a PGC_BACKEND parameter is changed in the config file, - * we want to accept the new value in the postmaster (whence - * it will propagate to subsequently-started backends), but - * ignore it in existing backends. This is a tad klugy, but - * necessary because we don't re-read the config file during - * backend start. + * If a PGC_BACKEND or PGC_SU_BACKEND parameter is changed in + * the config file, we want to accept the new value in the + * postmaster (whence it will propagate to + * subsequently-started backends), but ignore it in existing + * backends. This is a tad klugy, but necessary because we + * don't re-read the config file during backend start. * * In EXEC_BACKEND builds, this works differently: we load all * nondefault settings from the CONFIG_EXEC_PARAMS file during @@ -5722,7 +5734,9 @@ set_config_option(const char *name, const char *value, return -1; #endif } - else if (context != PGC_POSTMASTER && context != PGC_BACKEND && + else if (context != PGC_POSTMASTER && + context != PGC_BACKEND && + context != PGC_SU_BACKEND && source != PGC_S_CLIENT) { ereport(elevel, @@ -6771,7 +6785,8 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt) if (record == NULL) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("unrecognized configuration parameter \"%s\"", name))); + errmsg("unrecognized configuration parameter \"%s\"", + name))); /* * Don't allow the parameters which can't be set in configuration @@ -6780,16 +6795,17 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt) if ((record->context == PGC_INTERNAL) || (record->flags & GUC_DISALLOW_IN_FILE) || (record->flags & GUC_DISALLOW_IN_AUTO_FILE)) - ereport(ERROR, - (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM), - errmsg("parameter \"%s\" cannot be changed", - name))); + ereport(ERROR, + (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM), + errmsg("parameter \"%s\" cannot be changed", + name))); if (!validate_conf_option(record, name, value, PGC_S_FILE, ERROR, true, NULL, &newextra)) ereport(ERROR, - (errmsg("invalid value for parameter \"%s\": \"%s\"", name, value))); + (errmsg("invalid value for parameter \"%s\": \"%s\"", + name, value))); } @@ -6817,7 +6833,7 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt) if (Tmpfd < 0) ereport(ERROR, (errcode_for_file_access(), - errmsg("failed to open auto conf temp file \"%s\": %m ", + errmsg("failed to open auto conf temp file \"%s\": %m", AutoConfTmpFileName))); PG_TRY(); @@ -6835,8 +6851,8 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt) infile = AllocateFile(AutoConfFileName, "r"); if (infile == NULL) ereport(ERROR, - (errmsg("failed to open auto conf file \"%s\": %m ", - AutoConfFileName))); + (errmsg("failed to open auto conf file \"%s\": %m", + AutoConfFileName))); /* parse it */ ParseConfigFp(infile, AutoConfFileName, 0, LOG, &head, &tail); @@ -8388,8 +8404,8 @@ read_nondefault_variables(void) GucContext varscontext; /* - * Assert that PGC_BACKEND case in set_config_option() will do the right - * thing. + * Assert that PGC_BACKEND/PGC_SU_BACKEND case in set_config_option() will + * do the right thing. */ Assert(IsInitProcessingMode()); |