From: Tom Lane Date: Thu, 28 May 2015 16:44:31 +0000 (-0400) Subject: Fix pg_rewind's handling of top-level symlinks. X-Git-Tag: REL9_5_ALPHA1~140 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0381fefaa44f04e17dffb7e46e7677374a4fb2c7;p=postgresql 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. --- diff --git a/src/bin/pg_rewind/copy_fetch.c b/src/bin/pg_rewind/copy_fetch.c index c92744ca77..1ca00d12ad 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",