Alexandre Julliard : ntdll: Use stack buffers to retrieve the drive info from mountmgr.

Alexandre Julliard julliard at winehq.org
Thu Jul 9 17:10:39 CDT 2020


Module: wine
Branch: master
Commit: b14eee69c7240658252bc96b6302e98948f2c62c
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=b14eee69c7240658252bc96b6302e98948f2c62c

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jul  9 10:17:50 2020 +0200

ntdll: Use stack buffers to retrieve the drive info from mountmgr.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/file.c | 74 ++++++++++++--------------------------------------
 1 file changed, 18 insertions(+), 56 deletions(-)

diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
index 9356fb03f4..a0ad361fcb 100644
--- a/dlls/ntdll/unix/file.c
+++ b/dlls/ntdll/unix/file.c
@@ -1946,9 +1946,8 @@ static int find_dos_device( const char *path )
     return -1;
 }
 
-static struct mountmgr_unix_drive *get_mountmgr_fs_info( HANDLE handle, int fd )
+static NTSTATUS get_mountmgr_fs_info( HANDLE handle, int fd, struct mountmgr_unix_drive *drive, ULONG size )
 {
-    struct mountmgr_unix_drive *drive;
     OBJECT_ATTRIBUTES attr;
     UNICODE_STRING string;
     char *unix_name;
@@ -1957,25 +1956,16 @@ static struct mountmgr_unix_drive *get_mountmgr_fs_info( HANDLE handle, int fd )
     NTSTATUS status;
     int letter;
 
-    if (server_get_unix_name( handle, &unix_name ))
-        return NULL;
+    if ((status = server_get_unix_name( handle, &unix_name ))) return status;
 
     letter = find_dos_device( unix_name );
     RtlFreeHeap( GetProcessHeap(), 0, unix_name );
 
-    if (!(drive = RtlAllocateHeap( GetProcessHeap(), 0, 1024 )))
-        return NULL;
-
     if (letter == -1)
     {
         struct stat st;
 
-        if (fstat( fd, &st ) == -1)
-        {
-            RtlFreeHeap( GetProcessHeap(), 0, drive );
-            return NULL;
-        }
-
+        fstat( fd, &st );
         drive->unix_dev = st.st_dev;
         drive->letter = 0;
     }
@@ -1984,36 +1974,16 @@ static struct mountmgr_unix_drive *get_mountmgr_fs_info( HANDLE handle, int fd )
 
     RtlInitUnicodeString( &string, MOUNTMGR_DEVICE_NAME );
     InitializeObjectAttributes( &attr, &string, 0, NULL, NULL );
-    if (NtOpenFile( &mountmgr, GENERIC_READ | SYNCHRONIZE, &attr, &io,
-                    FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SYNCHRONOUS_IO_NONALERT ))
-    {
-        RtlFreeHeap( GetProcessHeap(), 0, drive );
-        return NULL;
-    }
+    status = NtOpenFile( &mountmgr, GENERIC_READ | SYNCHRONIZE, &attr, &io,
+                         FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SYNCHRONOUS_IO_NONALERT );
+    if (status) return status;
 
     status = NtDeviceIoControlFile( mountmgr, NULL, NULL, NULL, &io, IOCTL_MOUNTMGR_QUERY_UNIX_DRIVE,
-                                    drive, sizeof(*drive), drive, 1024 );
-    if (status == STATUS_BUFFER_OVERFLOW)
-    {
-        if (!(drive = RtlReAllocateHeap( GetProcessHeap(), 0, drive, drive->size )))
-        {
-            RtlFreeHeap( GetProcessHeap(), 0, drive );
-            NtClose( mountmgr );
-            return NULL;
-        }
-        status = NtDeviceIoControlFile( mountmgr, NULL, NULL, NULL, &io, IOCTL_MOUNTMGR_QUERY_UNIX_DRIVE,
-                                        drive, sizeof(*drive), drive, drive->size );
-    }
+                                    drive, sizeof(*drive), drive, size );
     NtClose( mountmgr );
-
-    if (status)
-    {
-        WARN("failed to retrieve filesystem type from mountmgr, status %#x\n", status);
-        RtlFreeHeap( GetProcessHeap(), 0, drive );
-        return NULL;
-    }
-
-    return drive;
+    if (status == STATUS_BUFFER_OVERFLOW) status = STATUS_SUCCESS;
+    else if (status) WARN("failed to retrieve filesystem type from mountmgr, status %#x\n", status);
+    return status;
 }
 
 
@@ -4106,15 +4076,12 @@ NTSTATUS WINAPI NtQueryInformationFile( HANDLE handle, IO_STATUS_BLOCK *io,
         if (fd_get_file_info( fd, options, &st, &attr ) == -1) io->u.Status = errno_to_status( errno );
         else
         {
-            struct mountmgr_unix_drive *drive;
+            struct mountmgr_unix_drive drive;
             FILE_ID_INFORMATION *info = ptr;
 
             info->VolumeSerialNumber = 0;
-            if ((drive = get_mountmgr_fs_info( handle, fd )))
-            {
-                info->VolumeSerialNumber = drive->serial;
-                RtlFreeHeap( GetProcessHeap(), 0, drive );
-            }
+            if (!(io->u.Status = get_mountmgr_fs_info( handle, fd, &drive, sizeof(drive) )))
+                info->VolumeSerialNumber = drive.serial;
             memset( &info->FileId, 0, sizeof(info->FileId) );
             *(ULONGLONG *)&info->FileId = st.st_ino;
         }
@@ -6212,7 +6179,7 @@ NTSTATUS WINAPI NtQueryVolumeInformationFile( HANDLE handle, IO_STATUS_BLOCK *io
         static const WCHAR udfW[] = {'U','D','F'};
 
         FILE_FS_ATTRIBUTE_INFORMATION *info = buffer;
-        struct mountmgr_unix_drive *drive;
+        struct mountmgr_unix_drive drive;
         enum mountmgr_fs_type fs_type = MOUNTMGR_FS_TYPE_NTFS;
 
         if (length < sizeof(FILE_FS_ATTRIBUTE_INFORMATION))
@@ -6221,11 +6188,7 @@ NTSTATUS WINAPI NtQueryVolumeInformationFile( HANDLE handle, IO_STATUS_BLOCK *io
             break;
         }
 
-        if ((drive = get_mountmgr_fs_info( handle, fd )))
-        {
-            fs_type = drive->fs_type;
-            RtlFreeHeap( GetProcessHeap(), 0, drive );
-        }
+        if (!get_mountmgr_fs_info( handle, fd, &drive, sizeof(drive) )) fs_type = drive.fs_type;
         else
         {
             struct statfs stfs;
@@ -6298,7 +6261,8 @@ NTSTATUS WINAPI NtQueryVolumeInformationFile( HANDLE handle, IO_STATUS_BLOCK *io
     case FileFsVolumeInformation:
     {
         FILE_FS_VOLUME_INFORMATION *info = buffer;
-        struct mountmgr_unix_drive *drive;
+        ULONGLONG data[64];
+        struct mountmgr_unix_drive *drive = (struct mountmgr_unix_drive *)data;
         const WCHAR *label;
 
         if (length < sizeof(FILE_FS_VOLUME_INFORMATION))
@@ -6307,7 +6271,7 @@ NTSTATUS WINAPI NtQueryVolumeInformationFile( HANDLE handle, IO_STATUS_BLOCK *io
             break;
         }
 
-        if (!(drive = get_mountmgr_fs_info( handle, fd )))
+        if (get_mountmgr_fs_info( handle, fd, drive, sizeof(data) ))
         {
             io->u.Status = STATUS_NOT_IMPLEMENTED;
             break;
@@ -6320,8 +6284,6 @@ NTSTATUS WINAPI NtQueryVolumeInformationFile( HANDLE handle, IO_STATUS_BLOCK *io
                                        length - offsetof( FILE_FS_VOLUME_INFORMATION, VolumeLabel ) );
         info->SupportsObjects = (drive->fs_type == MOUNTMGR_FS_TYPE_NTFS);
         memcpy( info->VolumeLabel, label, info->VolumeLabelLength );
-        RtlFreeHeap( GetProcessHeap(), 0, drive );
-
         io->Information = offsetof( FILE_FS_VOLUME_INFORMATION, VolumeLabel ) + info->VolumeLabelLength;
         io->u.Status = STATUS_SUCCESS;
         break;




More information about the wine-cvs mailing list