aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2008-06-02 03:48:07 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2008-06-02 03:48:07 +0000
commitbc0c7e9876601ffa1be7407c6a9572650de334f2 (patch)
tree6b95a3ce7a0654925496929b0822f83679a7fc6c
parent77241fe9fd2e5f2df6bbe88ad301b10b0f9c4127 (diff)
downloadpostgresql-bc0c7e9876601ffa1be7407c6a9572650de334f2.tar.gz
postgresql-bc0c7e9876601ffa1be7407c6a9572650de334f2.zip
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.
-rw-r--r--src/bin/initdb/initdb.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index abdb4d3f259..0fc76f199f2 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -42,7 +42,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
* Portions taken from FreeBSD.
*
- * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.152.2.2 2008/02/29 23:31:42 adunstan Exp $
+ * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.152.2.3 2008/06/02 03:48:07 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -3005,8 +3005,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))
@@ -3024,9 +3029,7 @@ main(int argc, char *argv[])
exit_nicely();
}
else
- {
check_ok();
- }
made_new_xlogdir = true;
break;
@@ -3056,7 +3059,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 */
@@ -3065,6 +3068,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)
{