]> granicus.if.org Git - postgresql/commitdiff
Fix pg_rewind's handling of top-level symlinks.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 28 May 2015 16:44:31 +0000 (12:44 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 28 May 2015 16:44:39 +0000 (12:44 -0400)
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

index c92744ca77245924462d4b87a6357821f52d7e3d..1ca00d12adfb2f49c15f74ccfd12c6783eef2cef 100644 (file)
@@ -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",