diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 193318d5f9baa2e7e57e2e14eb68fdcabf878e1b..7e29f9ddd5d5d7fb4a9a021f17bc08c2f7ef3c11 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.155 2008/02/29 23:31:20 adunstan Exp $
+ * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.156 2008/06/02 03:48:00 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -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)
 		{