]> granicus.if.org Git - postgresql/commitdiff
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:44:55 +0000 (21:44 -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 4e3a45f98928f4444c4f17116d6923a7c80983e6..bb098202ad8c0305f16615afed6fa9b037b4e4d3 100644 (file)
@@ -201,6 +201,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);
 
@@ -1131,9 +1136,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;