From a4bfb779b866c43ae6c96243d8879ce63741d479 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 2 Jun 2008 03:48:07 +0000 Subject: [PATCH] Fix initdb to reject a relative path for -X (--xlogdir) argument. This doesn't work, and the real reason why not is it's unclear where the path is relative to (initdb's CWD, or the data directory?). We could make an arbitrary decision, but it seems best to make the user be unambiguous. Per gripe from Devrim. --- src/bin/initdb/initdb.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index c77630ec27..aff81b452e 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -3002,8 +3002,13 @@ main(int argc, char *argv[]) { char *linkloc; - linkloc = (char *) pg_malloc(strlen(pg_data) + 8 + 2); - sprintf(linkloc, "%s/pg_xlog", pg_data); + /* clean up xlog directory name, check it's absolute */ + canonicalize_path(xlog_dir); + if (!is_absolute_path(xlog_dir)) + { + fprintf(stderr, _("%s: xlog directory location must be an absolute path\n"), progname); + exit_nicely(); + } /* check if the specified xlog directory is empty */ switch (check_data_dir(xlog_dir)) @@ -3021,9 +3026,7 @@ main(int argc, char *argv[]) exit_nicely(); } else - { check_ok(); - } made_new_xlogdir = true; break; @@ -3053,7 +3056,7 @@ main(int argc, char *argv[]) _("If you want to store the transaction log there, either\n" "remove or empty the directory \"%s\".\n"), xlog_dir); - exit(1); /* no further message needed */ + exit_nicely(); default: /* Trouble accessing directory */ @@ -3062,6 +3065,10 @@ main(int argc, char *argv[]) exit_nicely(); } + /* form name of the place where the symlink must go */ + linkloc = (char *) pg_malloc(strlen(pg_data) + 8 + 1); + sprintf(linkloc, "%s/pg_xlog", pg_data); + #ifdef HAVE_SYMLINK if (symlink(xlog_dir, linkloc) != 0) { -- 2.39.5