Commit 0381fefa authored by Tom Lane's avatar Tom Lane

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.
parent e5f1a4f1
......@@ -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",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment