diff --git a/src/port/path.c b/src/port/path.c index b384b5e329..f03b9f4dea 100644 --- a/src/port/path.c +++ b/src/port/path.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/port/path.c,v 1.44 2004/11/06 21:39:45 tgl Exp $ + * $PostgreSQL: pgsql/src/port/path.c,v 1.45 2004/11/07 02:12:17 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -203,21 +203,22 @@ join_path_components(char *ret_path, * o make Win32 path use Unix slashes * o remove trailing quote on Win32 * o remove trailing slash + * o remove duplicate adjacent separators * o remove trailing '.' * o process trailing '..' ourselves */ void canonicalize_path(char *path) { -#ifdef WIN32 + char *p, *to_p; + bool was_sep = false; +#ifdef WIN32 /* * The Windows command processor will accept suitably quoted paths * with forward slashes, but barfs badly with mixed forward and back * slashes. */ - char *p; - for (p = path; *p; p++) { if (*p == '\\') @@ -226,7 +227,7 @@ canonicalize_path(char *path) /* * In Win32, if you do: prog.exe "a b" "\c\d\" the system will pass - * \c\d" as argv[2]. + * \c\d" as argv[2], so trim off trailing quote. */ if (p > path && *(p - 1) == '"') *(p - 1) = '/'; @@ -239,6 +240,27 @@ canonicalize_path(char *path) */ trim_trailing_separator(path); + /* + * Remove duplicate adjacent separators + */ + p = path; +#ifdef WIN32 + /* Don't remove leading double-slash on Win32 */ + if (*p) + p++; +#endif + to_p = p; + for (; *p; p++, to_p++) + { + /* Handle many adjacent slashes, like "/a///b" */ + while (*p == '/' && was_sep) + p++; + if (to_p != p) + *to_p = *p; + was_sep = (*p == '/'); + } + *to_p = '\0'; + /* * Remove any trailing uses of "." and process ".." ourselves */ @@ -247,9 +269,7 @@ canonicalize_path(char *path) int len = strlen(path); if (len > 2 && strcmp(path + len - 2, "/.") == 0) - { trim_directory(path); - } else if (len > 3 && strcmp(path + len - 3, "/..") == 0) { trim_directory(path);