From: Paul Gofman pgofman@codeweavers.com
--- dlls/kernel32/tests/file.c | 6 ++---- dlls/ntdll/unix/file.c | 8 ++++++-- 2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index 940b1441e19..dc9f67e2f03 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -3063,11 +3063,9 @@ static void test_FindFirstFile_wildcards(void) {0, "* ..", ", '.', '..', 'a', '.a', '..a', 'aa', 'aaa', 'aaaa', '.aaa'"}, {0, " *..", ""}, {0, "..* ", ", '.', '..', '..a', '..a.a'"}, - {1, "a*.", ", '..a', '.a', '.aaa', 'a', 'aa', 'aaa', 'aaaa'"}, + {0, "a*.", ", '..a', '.a', '.aaa', 'a', 'aa', 'aaa', 'aaaa'"}, {0, "*a ", ", '..a', '..a.a', '.a', '.a..a', '.a.a', '.aaa', 'a', 'a..a', 'a.a', 'a.a.a', 'aa', 'aaa', 'aaaa', ' .a'"}, - - /* a.a.a not found due to short name mismatch, a.a.a -> "AA6BF5~1.A on Windows. */ - {1, "*aa*", ", '.aaa', 'a.a.a', 'aa', 'aaa', 'aaaa'"}, + {0, "*aa*", ", '.aaa', 'a.a.a', 'aa', 'aaa', 'aaaa'"},
{1, "<.<.<", ", '..a', '..a.a', '.a..a', '.a.a', 'a..a', 'a.a.a'"}, {1, "<.<.", ", '.', '..', '..a', '..a.a', '.a', '.a..a', '.a.a', '.aaa', 'a..a', 'a.a', 'a.a.a', ' .a'"}, diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c index ce3bc24c5f4..89fd942ea3b 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c @@ -1383,13 +1383,17 @@ static ULONG hash_short_file_name( const WCHAR *name, int length, LPWSTR buffer }
/* Find last dot for start of the extension */ - for (p = name + 1, ext = NULL; p < end - 1; p++) if (*p == '.') ext = p; + p = name; + while (*p == '.') ++p; + for (p = p + 1, ext = NULL; p < end - 1; p++) if (*p == '.') ext = p;
/* Copy first 4 chars, replacing invalid chars with '_' */ - for (i = 4, p = name, dst = buffer; i > 0; i--, p++) + for (i = 4, p = name, dst = buffer; i > 0; p++) { if (p == end || p == ext) break; + if (*p == '.') continue; *dst++ = is_invalid_dos_char(*p) ? '_' : *p; + i--; } /* Pad to 5 chars with '~' */ while (i-- >= 0) *dst++ = '~';