postgres.git / summary / log / commit / refs
commit 0381fefaa44f04e17dffb7e46e7677374a4fb2c7
Author: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu May 28 16:44:31 2015 +0000
First released in: 9.5.0
Fix pg_rewind's handling of top-level symlinks.
The previous coding suffered a null-pointer dereference if it found any
symlink at the top level of $PGDATA. Fix that, and teach it to recurse
into a symlink for pg_xlog, but not anything else.
Per note from Abhijit Menon-Sen.
src/bin/pg_rewind/copy_fetch.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/bin/pg_rewind/copy_fetch.c b/src/bin/pg_rewind/copy_fetch.c
index c92744ca772..1ca00d12adf 100644
--- a/src/bin/pg_rewind/copy_fetch.c
+++ b/src/bin/pg_rewind/copy_fetch.c
@@ -42,6 +42,9 @@ traverse_datadir(const char *datadir, process_file_callback_t callback)
/*
* recursive part of traverse_datadir
+ *
+ * parent_path is the current subdirectory's path relative to datadir,
+ * or NULL at the top level.
*/
static void
recurse_dir(const char *datadir, const char *parentpath,
@@ -127,9 +130,11 @@ recurse_dir(const char *datadir, const char *parentpath,
/*
* If it's a symlink within pg_tblspc, we need to recurse into it,
- * to process all the tablespaces.
+ * to process all the tablespaces. We also follow a symlink if
+ * it's for pg_xlog. Symlinks elsewhere are ignored.
*/
- if (strcmp(parentpath, "pg_tblspc") == 0)
+ if ((parentpath && strcmp(parentpath, "pg_tblspc") == 0) ||
+ strcmp(path, "pg_xlog") == 0)
recurse_dir(datadir, path, callback);
#else
pg_fatal("\"%s\" is a symbolic link, but symbolic links are not supported on this platform\n",
[parent: e5f1a4f1e350]