From 07791ffe43d1fda2618994f98986ab5e9cbf3c97 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Sat, 6 Feb 2016 18:31:25 +0100
Subject: kernel32: Strip invalid characters from mask in FindFirstFileExW.

---
 dlls/kernel32/file.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c
index b6dba6a..3297f4b 100644
--- a/dlls/kernel32/file.c
+++ b/dlls/kernel32/file.c
@@ -2009,12 +2009,32 @@ HANDLE WINAPI FindFirstFileExW( LPCWSTR filename, FINDEX_INFO_LEVELS level,
     }
     else
     {
+        static const WCHAR invalidW[] = { '<', '>', '\"', 0 };
+        static const WCHAR wildcardW[] = { '*', 0 };
+        DWORD mask_len;
+
         if (!RtlCreateUnicodeString( &info->mask, mask ))
         {
             SetLastError( ERROR_NOT_ENOUGH_MEMORY );
             goto error;
         }
 
+        /* strip invalid characters from mask */
+        mask_len = info->mask.Length / sizeof(WCHAR);
+        while (mask_len && strchrW(invalidW, mask[mask_len - 1]))
+            mask_len--;
+
+        if (!mask_len)
+        {
+            strcpyW( info->mask.Buffer, wildcardW );
+            info->mask.Length = strlenW(wildcardW) * sizeof(WCHAR);
+        }
+        else
+        {
+            info->mask.Buffer[mask_len] = 0;
+            info->mask.Length = mask_len * sizeof(WCHAR);
+        }
+
         /* truncate dir name before mask */
         *mask = 0;
         nt_name.Length = (mask - nt_name.Buffer) * sizeof(WCHAR);
-- 
2.7.0

