diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index 054e8d78227d116020b257ac50b31413d678d9b6..cc624b07e6fe95481f176f52643f05279ce337c2 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -4,7 +4,7 @@
  *
  * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.42 2004/10/22 00:24:18 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.43 2004/10/27 17:17:07 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1279,19 +1279,23 @@ main(int argc, char **argv)
 			{
 				case 'D':
 					{
-						int			len = strlen(optarg);
-						char	   *env_var;
+						char	   *pgdata_D = xmalloc(strlen(optarg));
+						char	   *env_var = xmalloc(strlen(optarg) + 8);
 
-						env_var = xmalloc(len + 8);
-						snprintf(env_var, len + 8, "PGDATA=%s", optarg);
+						strcpy(pgdata_D, optarg);
+						canonicalize_path(pgdata_D);
+						snprintf(env_var, strlen(pgdata_D) + 8, "PGDATA=%s",
+								 pgdata_D);
 						putenv(env_var);
 
 						/*
-						 * Show -D for easier postmaster 'ps'
-						 * identification
+						 *	We could pass PGDATA just in an environment
+						 *	variable but we do -D too for clearer
+						 *	postmaster 'ps' display
 						 */
-						pgdata_opt = xmalloc(len + 7);
-						snprintf(pgdata_opt, len + 7, "-D \"%s\" ", optarg);
+						pgdata_opt = xmalloc(strlen(pgdata_D) + 7);
+						snprintf(pgdata_opt, strlen(pgdata_D) + 7, "-D \"%s\" ",
+								 pgdata_D);
 						break;
 					}
 				case 'l':
diff --git a/src/port/path.c b/src/port/path.c
index 65fc36e674cca5dde7411bc9ad430fed67d93bf2..896a0378b2d0073c6eea3ab1badab717641aac61 100644
--- a/src/port/path.c
+++ b/src/port/path.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/port/path.c,v 1.37 2004/10/24 22:08:19 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/port/path.c,v 1.38 2004/10/27 17:17:09 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -115,7 +115,12 @@ make_native_path(char *filename)
 
 
 /*
- * Make all paths look like Unix
+ *	Clean up path by:
+ *		o  make Win32 path use Unix slashes
+ *		o  remove trailling quote on Win32
+ *		o  remove trailling slash
+ *		o  remove trailing '.'
+ *		o  process trailing '..' ourselves
  */
 void
 canonicalize_path(char *path)
@@ -145,13 +150,13 @@ canonicalize_path(char *path)
 
 	/*
 	 * Removing the trailing slash on a path means we never get ugly
-	 * double slashes.	Also, Win32 can't stat() a directory with a
-	 * trailing slash. Don't remove a leading slash, though.
+	 * double trailing slashes.	Also, Win32 can't stat() a directory
+	 * with a trailing slash. Don't remove a leading slash, though.
 	 */
 	trim_trailing_separator(path);
 
 	/*
-	 * Remove any trailing uses of "." or "..", too.
+	 * Remove any trailing uses of "." and process ".." ourselves
 	 */
 	for (;;)
 	{
@@ -165,7 +170,7 @@ canonicalize_path(char *path)
 		else if (len >= 3 && strcmp(path + len - 3, "/..") == 0)
 		{
 			trim_directory(path);
-			trim_directory(path);
+			trim_directory(path);	/* remove directory above */
 			trim_trailing_separator(path);
 		}
 		else