From: Paul Gofman pgofman@codeweavers.com
--- dlls/ntdll/tests/directory.c | 11 +++++++++++ dlls/ntdll/unix/file.c | 12 ++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/tests/directory.c b/dlls/ntdll/tests/directory.c index d61a1a73b3f..babe0f7a8fe 100644 --- a/dlls/ntdll/tests/directory.c +++ b/dlls/ntdll/tests/directory.c @@ -531,6 +531,17 @@ static void test_NtQueryDirectoryFile(void) {L"<<<", {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}, {L"< ..", {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, {L"<""", {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1}}, + {L">", {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0}}, + {L">.", {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0}}, + {L">..", {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}, + {L">>", {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0}}, + {L">>.", {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0}}, + {L">>>", {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0}}, + {L">>.>>>", {0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1}}, + {L">.>", {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1}}, + {L">>.tmp", {0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, + {L">>tmp", {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, + {L">>>tmp", {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, };
OBJECT_ATTRIBUTES attr; diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c index eee3610b487..d3bbcdffdc6 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c @@ -1487,10 +1487,18 @@ static BOOLEAN match_filename_part( const WCHAR *name, const WCHAR *name_end, co break; } case '?': - case '>': mask++; name++; break; + case '>': + mask++; + if (*name == '.') + { + while (mask < mask_end && *mask == '>') mask++; + if (mask == mask_end) name++; + } + else name++; + break; default: c = *mask == '"' ? '.' : *mask; if (is_case_sensitive && c != *name) return FALSE; @@ -1500,7 +1508,7 @@ static BOOLEAN match_filename_part( const WCHAR *name, const WCHAR *name_end, co break; } } - while (mask < mask_end && (*mask == '*' || *mask == '<' || *mask == '"')) + while (mask < mask_end && (*mask == '*' || *mask == '<' || *mask == '"' || *mask == '>')) mask++; return (name == name_end && mask == mask_end); }