From 564c951f0c92847a86eb3aba4fa2c4185a5b2b50 Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Fri, 20 Oct 2017 10:57:43 +0900 Subject: [PATCH] Prevent relative configuration file path being stored in the repmgr metadata The configuration file path is stored to make remote execution of repmgr (e.g. during "repmgr standby switchover") simpler, so relative paths make no sense. Addresses GitHub #332 --- configfile.c | 54 ++++++++++++++++++++++++++++++++ doc/configuration-file.sgml | 13 ++++++++ doc/repmgr-primary-register.sgml | 14 +++++++++ doc/repmgr-standby-register.sgml | 13 ++++++++ 4 files changed, 94 insertions(+) diff --git a/configfile.c b/configfile.c index b2246de5..c492544d 100644 --- a/configfile.c +++ b/configfile.c @@ -73,6 +73,59 @@ load_config(const char *config_file, bool verbose, bool terse, t_configuration_o strncpy(config_file_path, config_file, MAXPGPATH); canonicalize_path(config_file_path); + /* relative path supplied - convert to absolute path */ + if (config_file_path[0] != '/') + { + PQExpBufferData fullpath; + char *pwd = NULL; + + initPQExpBuffer(&fullpath); + + /* + * we'll attempt to use $PWD to derive the effective path; getcwd() + * will likely resolve symlinks, which may result in a path which + * isn't permanent (e.g. if filesystem mountpoints change). + */ + pwd = getenv("PWD"); + + if (pwd != NULL) + { + appendPQExpBuffer(&fullpath, + "%s", pwd); + } + else + { + /* $PWD not available - fall back to getcwd() */ + char cwd[MAXPGPATH] = ""; + + if (getcwd(cwd, MAXPGPATH) == NULL) + { + log_error(_("unable to execute getcwd()")); + log_detail("%s", strerror(errno)); + + termPQExpBuffer(&fullpath); + exit(ERR_BAD_CONFIG); + } + + appendPQExpBuffer(&fullpath, + "%s", + cwd); + } + + appendPQExpBuffer(&fullpath, + "/%s", config_file_path); + + log_debug("relative configuration file converted to:\n \"%s\"", + fullpath.data); + + strncpy(config_file_path, fullpath.data, MAXPGPATH); + + termPQExpBuffer(&fullpath); + + canonicalize_path(config_file_path); + } + + if (stat(config_file_path, &stat_config) != 0) { log_error(_("provided configuration file \"%s\" not found: %s"), @@ -81,6 +134,7 @@ load_config(const char *config_file, bool verbose, bool terse, t_configuration_o exit(ERR_BAD_CONFIG); } + if (verbose == true) { log_notice(_("using provided configuration file \"%s\""), config_file); diff --git a/doc/configuration-file.sgml b/doc/configuration-file.sgml index 9c2c1a84..6b097e72 100644 --- a/doc/configuration-file.sgml +++ b/doc/configuration-file.sgml @@ -48,4 +48,17 @@ reading the wrong configuraton file. + + + If providing the configuration file location with -f/--config-file, + avoid using a relative path, particularly when executing + and , as &repmgr; stores the configuration file location + in the repmgr metadata for use when &repmgr; is executed remotely (e.g. during + ). &repmgr; will attempt to convert the + a relative path into an absolute one, but this may not be the same as the path you + would explicitly provide (e.g. ./repmgr.conf might be converted + to /path/to/./repmgr.conf, whereas you'd normally write + /path/to/repmgr.conf). + + diff --git a/doc/repmgr-primary-register.sgml b/doc/repmgr-primary-register.sgml index 08208e79..34f78725 100644 --- a/doc/repmgr-primary-register.sgml +++ b/doc/repmgr-primary-register.sgml @@ -15,4 +15,18 @@ repmgr master register can be used as an alias for repmgr primary register. + + + + If providing the configuration file location with -f/--config-file, + avoid using a relative path, as &repmgr; stores the configuration file location + in the repmgr metadata for use when &repmgr; is executed remotely (e.g. during + ). &repmgr; will attempt to convert the + a relative path into an absolute one, but this may not be the same as the path you + would explicitly provide (e.g. ./repmgr.conf might be converted + to /path/to/./repmgr.conf, whereas you'd normally write + /path/to/repmgr.conf). + + + diff --git a/doc/repmgr-standby-register.sgml b/doc/repmgr-standby-register.sgml index 6f553bf6..03628d22 100644 --- a/doc/repmgr-standby-register.sgml +++ b/doc/repmgr-standby-register.sgml @@ -10,6 +10,19 @@ standby. + + + If providing the configuration file location with -f/--config-file, + avoid using a relative path, as &repmgr; stores the configuration file location + in the repmgr metadata for use when &repmgr; is executed remotely (e.g. during + ). &repmgr; will attempt to convert the + a relative path into an absolute one, but this may not be the same as the path you + would explicitly provide (e.g. ./repmgr.conf might be converted + to /path/to/./repmgr.conf, whereas you'd normally write + /path/to/repmgr.conf). + + + Waiting for the registration to propagate to the standby