[PATCH] ntdll: Fix CreateFile for non-existing files on FAT file systems

Joachim Priesner joachim.priesner at web.de
Mon Oct 12 23:20:23 CDT 2020


Two small bugs in find_file_in_dir/lookup_unix_name cause creation of
new files on FAT file systems to fail.

If the VFAT_IOCTL_READDIR_BOTH logic in find_file_in_dir does not yield
any result, the NUL terminator of "unix_name" must be restored. Else
the following opendir() call will read past the end of "unix_name".

Since at the beginning of find_file_in_dir, the full file name was
written to "unix_name" for the stat() shortcut logic, there is no
out-of-bounds read and the opendir() call will reliably fail. But
commit 688799b1f7b2750b938f8da771480d2c16d1ae1d changed the return
code for this case from STATUS_OBJECT_PATH_NOT_FOUND to
STATUS_OBJECT_NAME_NOT_FOUND, so lookup_unix_name needs to check for
that as well.

Signed-off-by: Joachim Priesner <joachim.priesner at web.de>
---
 dlls/ntdll/unix/file.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
index afb552be098..a443ff61282 100644
--- a/dlls/ntdll/unix/file.c
+++ b/dlls/ntdll/unix/file.c
@@ -2550,6 +2550,8 @@ static NTSTATUS find_file_in_dir( char *unix_name, int pos, const WCHAR *name, i
                         goto not_found;
                     }
                 }
+                /* if that did not work, restore previous state of unix_name */
+                unix_name[pos - 1] = 0;
             }
             close( fd );
         }
@@ -3133,6 +3135,9 @@ static NTSTATUS lookup_unix_name( const WCHAR *name, int name_len, char **buffer
             if (status == STATUS_OBJECT_PATH_NOT_FOUND)
             {
                 status = STATUS_OBJECT_NAME_NOT_FOUND;
+            }
+            if (status == STATUS_OBJECT_NAME_NOT_FOUND)
+            {
                 if (disposition != FILE_OPEN && disposition != FILE_OVERWRITE)
                 {
                     ret = ntdll_wcstoumbs( name, end - name, unix_name + pos + 1, MAX_DIR_ENTRY_LEN + 1, TRUE );
--
2.28.0




More information about the wine-devel mailing list