summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2024-01-02 14:38:33 -0800
committerKaz Kylheku <kaz@kylheku.com>2024-01-02 14:38:33 -0800
commit66019dbead11137ab3184dc0837f7c7ef92245b7 (patch)
tree68abc074f2cdca626e128fb93ab2fd028789f362
parent8288dcb545ecb6fa5034788c6918241bfe067ff4 (diff)
downloadcygnal-66019dbead11137ab3184dc0837f7c7ef92245b7.tar.gz
cygnal-66019dbead11137ab3184dc0837f7c7ef92245b7.tar.bz2
cygnal-66019dbead11137ab3184dc0837f7c7ef92245b7.zip
Fix broken handling of drive relative paths.
* winsup/cygwin/path.cc (normalize_win32_path): Fix bungled logic for replacing a relative drive reference with the working directory from that drive. We were wrongly copying an extra drive letter character.
-rw-r--r--winsup/cygwin/path.cc18
1 files changed, 11 insertions, 7 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 807a7c6ef..83718385d 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -1483,8 +1483,13 @@ normalize_win32_path (const char *src, char *dst, char *&tail)
/* Always convert drive letter to uppercase for case sensitivity. */
if (isdirsep (src[2]))
- /* Always convert drive letter to uppercase for case sensitivity. */
- *tail++ = cyg_toupper (*src++);
+ {
+ /* Always convert drive letter to uppercase for case sensitivity. */
+ *tail++ = cyg_toupper (*src++);
+ *tail++ = *src++;
+ *tail++ = *src++;
+ dst = tail;
+ }
else
{
/* Drive-relative path: get drive path from environment. */
@@ -1499,19 +1504,18 @@ normalize_win32_path (const char *src, char *dst, char *&tail)
return ENAMETOOLONG;
tail += len;
+ dst = tail;
*tail++ = '\\';
src += 2;
}
else
{
*tail++ = cyg_toupper (*src++);
+ *tail++ = *src++;
+ dst = tail;
+ *tail++ = '\\';
}
}
- *tail++ = *src++;
- dst = tail;
- /* If backslash is missing in src, add one. */
- if (!isdirsep (src[0]))
- *tail++ = '\\';
}
else
{