From 1943c000b7a22d3ca334196cfe3f7b8159b210c2 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 29 May 2015 17:02:58 -0400
Subject: [PATCH] initdb -S should now have an explicit check that $PGDATA is
 valid.

The fsync code from the backend essentially assumes that somebody's already
validated PGDATA, at least to the extent of it being a readable directory.
That's safe enough for initdb's normal code path too, but "initdb -S"
doesn't have any other processing at all that touches the target directory.
To have reasonable error-case behavior, add a pg_check_dir call.
Per gripe from Peter E.
---
 src/bin/initdb/initdb.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 6a73e9688bc..feeff9e864f 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -3564,10 +3564,19 @@ main(int argc, char *argv[])
 		exit(1);
 	}
 
-	/* If we only need to fsync, just to it and exit */
+	/* If we only need to fsync, just do it and exit */
 	if (sync_only)
 	{
 		setup_pgdata();
+
+		/* must check that directory is readable */
+		if (pg_check_dir(pg_data) <= 0)
+		{
+			fprintf(stderr, _("%s: could not access directory \"%s\": %s\n"),
+					progname, pg_data, strerror(errno));
+			exit_nicely();
+		}
+
 		fsync_pgdata();
 		return 0;
 	}
-- 
GitLab