diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2012-06-11 22:47:16 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2012-06-11 22:47:16 -0400 |
commit | 51e61b04f8040f627e7605594095b06c10582fd0 (patch) | |
tree | add9df96d89ff138c20bd56ffdebf733094b3b51 | |
parent | bf0945e8636bf0390ef4569bbbf9763573211e03 (diff) | |
download | postgresql-51e61b04f8040f627e7605594095b06c10582fd0.tar.gz postgresql-51e61b04f8040f627e7605594095b06c10582fd0.zip |
Ensure pg_ctl behaves sanely when data directory is not specified.
Commit aaa6e1def292cdacb6b27088898793b1b879fedf introduced multiple hazards
in the case where pg_ctl is executed with neither a -D switch nor any
PGDATA environment variable. It would dump core on machines which are
unforgiving about printf("%s", NULL), or failing that possibly give a
rather unhelpful complaint about being unable to execute "postgres -C",
rather than the logically prior complaint about not being told where the
data directory is.
Edmund Horner's report suggests that there is another, Windows-specific
hazard here, but I'm not the person to fix that; it would in any case only
be significant when trying to use a config-only PGDATA pointer.
-rw-r--r-- | src/bin/pg_ctl/pg_ctl.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 38828ec9142..d7b836762d8 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -1902,6 +1902,10 @@ adjust_data_dir(void) *my_exec_path; FILE *fd; + /* do nothing if we're working without knowledge of data dir */ + if (pg_config == NULL) + return; + /* If there is no postgresql.conf, it can't be a config-only dir */ snprintf(filename, sizeof(filename), "%s/postgresql.conf", pg_config); if ((fd = fopen(filename, "r")) == NULL) @@ -2188,8 +2192,10 @@ main(int argc, char **argv) pg_data = xstrdup(pg_config); } + /* -D might point at config-only directory; if so find the real PGDATA */ adjust_data_dir(); + /* Complain if -D needed and not provided */ if (pg_config == NULL && ctl_command != KILL_COMMAND && ctl_command != UNREGISTER_COMMAND) { |