Jacek Caban : ntdll: Fix handling \\.\CON path in RtlDosPathNameToNtPathName.

Alexandre Julliard julliard at winehq.org
Tue Apr 12 13:38:04 CDT 2022


Module: wine
Branch: oldstable
Commit: 2b48e780fec7697b4809571de1a6396482b79181
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2b48e780fec7697b4809571de1a6396482b79181

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Dec 30 15:49:38 2021 +0100

ntdll: Fix handling \\.\CON path in RtlDosPathNameToNtPathName.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=32183
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 32b81bfaff734164143343657bb40ea4e2c073e0)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/ntdll/path.c       |  4 +++-
 dlls/ntdll/tests/path.c | 11 +++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/dlls/ntdll/path.c b/dlls/ntdll/path.c
index e452c48df33..5dfb5256bdf 100644
--- a/dlls/ntdll/path.c
+++ b/dlls/ntdll/path.c
@@ -197,7 +197,8 @@ NTSTATUS WINAPI RtlDosPathNameToNtPathName_U_WithStatus(const WCHAR *dos_path, U
         return STATUS_OBJECT_NAME_INVALID;
 
     if (!memcmp(dos_path, global_prefix, sizeof(global_prefix)) ||
-        (!memcmp(dos_path, global_prefix2, sizeof(global_prefix2)) && dos_path[4]))
+        (!memcmp(dos_path, global_prefix2, sizeof(global_prefix2)) && dos_path[4]) ||
+        !wcsicmp( dos_path, L"\\\\.\\CON" ))
     {
         ntpath->Length = wcslen(dos_path) * sizeof(WCHAR);
         ntpath->MaximumLength = ntpath->Length + sizeof(WCHAR);
@@ -205,6 +206,7 @@ NTSTATUS WINAPI RtlDosPathNameToNtPathName_U_WithStatus(const WCHAR *dos_path, U
         if (!ntpath->Buffer) return STATUS_NO_MEMORY;
         memcpy( ntpath->Buffer, dos_path, ntpath->MaximumLength );
         ntpath->Buffer[1] = '?';  /* change \\?\ to \??\ */
+        ntpath->Buffer[2] = '?';
         if (file_part)
         {
             if ((ptr = wcsrchr( ntpath->Buffer, '\\' )) && ptr[1]) *file_part = ptr + 1;
diff --git a/dlls/ntdll/tests/path.c b/dlls/ntdll/tests/path.c
index cd6b9d3a623..1be46b5241d 100644
--- a/dlls/ntdll/tests/path.c
+++ b/dlls/ntdll/tests/path.c
@@ -119,6 +119,8 @@ static void test_RtlIsDosDeviceName_U(void)
         { "\\\\.\\CON",    8, 6, TRUE },  /* fails on win8 */
         { "\\\\.\\con",    8, 6, TRUE },  /* fails on win8 */
         { "\\\\.\\CON2",   0, 0 },
+        { "\\\\.\\CONIN$", 0, 0 },
+        { "\\\\.\\CONOUT$",0, 0 },
         { "",              0, 0 },
         { "\\\\foo\\nul",  0, 0 },
         { "c:\\nul:",      6, 6 },
@@ -434,6 +436,7 @@ static void test_RtlDosPathNameToNtPathName_U(void)
         const WCHAR *nt;
         int file_offset;    /* offset to file part */
         const WCHAR *alt_nt;
+        BOOL may_fail;
     }
     tests[] =
     {
@@ -518,6 +521,9 @@ static void test_RtlDosPathNameToNtPathName_U(void)
         {L"\\\\.\\foo/.",   L"\\??\\foo",                    4},
         {L"\\\\.\\foo/..",  L"\\??\\",                      -1},
         {L"\\\\.\\foo. . ", L"\\??\\foo",                    4},
+        {L"\\\\.\\CON",     L"\\??\\CON",                    4, NULL, TRUE}, /* broken on win7 */
+        {L"\\\\.\\CONIN$",  L"\\??\\CONIN$",                 4},
+        {L"\\\\.\\CONOUT$", L"\\??\\CONOUT$",                4},
 
         {L"\\\\?",          L"\\??\\",                      -1},
         {L"\\\\?\\",        L"\\??\\",                      -1},
@@ -585,6 +591,11 @@ static void test_RtlDosPathNameToNtPathName_U(void)
     for (i = 0; i < ARRAY_SIZE(tests); ++i)
     {
         ret = pRtlDosPathNameToNtPathName_U(tests[i].dos, &nameW, &file_part, NULL);
+        if (!ret && tests[i].may_fail)
+        {
+            win_skip("skipping broken %s\n", debugstr_w(tests[i].dos));
+            continue;
+        }
         ok(ret == TRUE, "%s: Got %d.\n", debugstr_w(tests[i].dos), ret);
 
         if (pRtlDosPathNameToNtPathName_U_WithStatus)




More information about the wine-cvs mailing list