From 3664fcdfef9e833fa9414e343a933d17a7d26740 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Sat, 4 Feb 2012 09:46:32 -0700 Subject: [PATCH] canonicalize: fix // handling On Cygwin, and other platforms where // is detected as distinct from / at configure time, the canonicalize routines were incorrectly treating all instances of multiple leading slashes as //. See also coreutils bug http://debbugs.gnu.org/10472 * lib/canonicalize.c (canonicalize_filename_mode): Don't convert /// to //, since only // is special. Signed-off-by: Eric Blake --- ChangeLog | 6 ++++++ lib/canonicalize.c | 12 +++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4bbe44754..a9aa40a9a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-02-04 Eric Blake + + canonicalize: fix // handling + * lib/canonicalize.c (canonicalize_filename_mode): Don't convert + /// to //, since only // is special. + 2012-02-04 Bruno Haible ioctl: Fix test failure on native Windows. diff --git a/lib/canonicalize.c b/lib/canonicalize.c index d3e56456b..ed094b776 100644 --- a/lib/canonicalize.c +++ b/lib/canonicalize.c @@ -145,7 +145,7 @@ canonicalize_filename_mode (const char *name, canonicalize_mode_t can_mode) rname_limit = rname + PATH_MAX; rname[0] = '/'; dest = rname + 1; - if (DOUBLE_SLASH_IS_DISTINCT_ROOT && name[1] == '/') + if (DOUBLE_SLASH_IS_DISTINCT_ROOT && name[1] == '/' && name[2] != '/') *dest++ = '/'; } @@ -169,7 +169,7 @@ canonicalize_filename_mode (const char *name, canonicalize_mode_t can_mode) if (dest > rname + 1) while ((--dest)[-1] != '/'); if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1 - && *dest == '/') + && *dest == '/' && dest[1] != '/') dest++; } else @@ -267,7 +267,8 @@ canonicalize_filename_mode (const char *name, canonicalize_mode_t can_mode) if (buf[0] == '/') { dest = rname + 1; /* It's an absolute symlink */ - if (DOUBLE_SLASH_IS_DISTINCT_ROOT && buf[1] == '/') + if (DOUBLE_SLASH_IS_DISTINCT_ROOT + && buf[1] == '/' && buf[2] != '/') *dest++ = '/'; } else @@ -277,7 +278,7 @@ canonicalize_filename_mode (const char *name, canonicalize_mode_t can_mode) if (dest > rname + 1) while ((--dest)[-1] != '/'); if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1 - && *dest == '/') + && *dest == '/' && dest[1] != '/') dest++; } @@ -295,7 +296,8 @@ canonicalize_filename_mode (const char *name, canonicalize_mode_t can_mode) } if (dest > rname + 1 && dest[-1] == '/') --dest; - if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1 && *dest == '/') + if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1 + && *dest == '/' && dest[1] != '/') dest++; *dest = '\0'; if (rname_limit != dest + 1) -- 2.11.0