pg_basebackup: Fix comparison handling of tablespace mappings on Windows
authorPeter Eisentraut <peter_e@gmx.net>
Wed, 1 Nov 2017 14:20:05 +0000 (10:20 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Thu, 2 Nov 2017 01:41:45 +0000 (21:41 -0400)
A candidate path needs to be canonicalized before being checked against
the mappings, because the mappings are also canonicalized.  This is
especially relevant on Windows

Reported-by: nb <nbedxp@gmail.com>
Author: Michael Paquier <michael.paquier@gmail.com>
Reviewed-by: Ashutosh Sharma <ashu.coek88@gmail.com>
src/bin/pg_basebackup/pg_basebackup.c

index dfb9b5ddcbc026e9fd280d255532dd1fd31fe418..a0e922b3cb607b83898fc0ec6c2196095b3ea861 100644 (file)
@@ -295,6 +295,11 @@ tablespace_list_append(const char *arg)
        exit(1);
    }
 
+   /*
+    * Comparisons done with these values should involve similarly
+    * canonicalized path values.  This is particularly sensitive on Windows
+    * where path values may not necessarily use Unix slashes.
+    */
    canonicalize_path(cell->old_dir);
    canonicalize_path(cell->new_dir);
 
@@ -1283,9 +1288,14 @@ static const char *
 get_tablespace_mapping(const char *dir)
 {
    TablespaceListCell *cell;
+   char        canon_dir[MAXPGPATH];
+
+   /* Canonicalize path for comparison consistency */
+   strlcpy(canon_dir, dir, sizeof(canon_dir));
+   canonicalize_path(canon_dir);
 
    for (cell = tablespace_dirs.head; cell; cell = cell->next)
-       if (strcmp(dir, cell->old_dir) == 0)
+       if (strcmp(canon_dir, cell->old_dir) == 0)
            return cell->new_dir;
 
    return dir;