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>
Wed, 1 Nov 2017 14:20:05 +0000 (10:20 -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 dac7299ff48ff01178b7a0de1d38c7ae4bfa0446..a8715d912d517889ad4e765d96b42fccf0c72cb9 100644 (file)
@@ -298,6 +298,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);
 
@@ -1303,9 +1308,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;