From 59cb363a5fd02adf32fca81380c6f438d8b75615 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 21 Dec 2009 16:44:37 +0000 Subject: [PATCH] * path.cc (cygwin_conv_path): Add band-aid including comment to avoid conversion from POSIX "." to Win32 ".\\". --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/path.cc | 21 ++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 77bc8618f..385115af4 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2009-12-21 Corinna Vinschen + + * path.cc (cygwin_conv_path): Add band-aid including comment to avoid + conversion from POSIX "." to Win32 ".\\". + 2009-12-21 Corinna Vinschen * exec.cc (execvp): Call find_exec with FE_NNF flag to enforce diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 6238f2bce..bd3463d88 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -2709,6 +2709,16 @@ cygwin_conv_path (cygwin_conv_path_t what, const void *from, void *to, *(buf += 2) = '\\'; } lsiz = strlen (buf) + 1; + /* TODO: Incoming "." is a special case which leads to a trailing + backslash ".\\" in the Win32 path. That's a result of the + conversion in normalize_posix_path. This should not occur + so the below code is just a band-aid. */ + if (!strcmp ((const char *) from, ".") && relative + && !strcmp (buf, ".\\")) + { + --lsiz; + buf[lsiz - 1] = '\0'; + } } break; case CCP_POSIX_TO_WIN_W: @@ -2727,7 +2737,16 @@ cygwin_conv_path (cygwin_conv_path_t what, const void *from, void *to, if (p.error) return_with_errno (p.error); } - lsiz = (p.get_wide_win32_path_len () + 1) * sizeof (WCHAR); + lsiz = p.get_wide_win32_path_len () + 1; + /* TODO: Same ".\\" band-aid as in CCP_POSIX_TO_WIN_A case. */ + if (!strcmp ((const char *) from, ".") && relative + && !wcscmp (p.get_nt_native_path ()->Buffer, L".\\")) + { + --lsiz; + p.get_nt_native_path ()->Length -= sizeof (WCHAR); + p.get_nt_native_path ()->Buffer[lsiz - 1] = L'\0'; + } + lsiz *= sizeof (WCHAR); break; case CCP_WIN_A_TO_POSIX: buf = tp.c_get ();