[PATCH 3/5] winebus.sys: Use a local variable to store buffer len.

Rémi Bernon rbernon at codeweavers.com
Thu Aug 12 02:47:01 CDT 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/winebus.sys/main.c | 26 +++++++++-----------------
 1 file changed, 9 insertions(+), 17 deletions(-)

diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index 3d040b1af5b..0ae1f01c822 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -822,6 +822,7 @@ static NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
     NTSTATUS status = irp->IoStatus.u.Status;
     IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp);
     struct device_extension *ext = (struct device_extension *)device->DeviceExtension;
+    ULONG code, buffer_len = irpsp->Parameters.DeviceIoControl.OutputBufferLength;
 
     TRACE("(%p, %p)\n", device, irp);
 
@@ -841,14 +842,14 @@ static NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
         return STATUS_DELETE_PENDING;
     }
 
-    switch (irpsp->Parameters.DeviceIoControl.IoControlCode)
+    switch ((code = irpsp->Parameters.DeviceIoControl.IoControlCode))
     {
         case IOCTL_HID_GET_DEVICE_ATTRIBUTES:
         {
             HID_DEVICE_ATTRIBUTES *attr = (HID_DEVICE_ATTRIBUTES *)irp->UserBuffer;
             TRACE("IOCTL_HID_GET_DEVICE_ATTRIBUTES\n");
 
-            if (irpsp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(*attr))
+            if (buffer_len < sizeof(*attr))
             {
                 irp->IoStatus.u.Status = status = STATUS_BUFFER_TOO_SMALL;
                 break;
@@ -870,7 +871,7 @@ static NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
             DWORD length;
             TRACE("IOCTL_HID_GET_DEVICE_DESCRIPTOR\n");
 
-            if (irpsp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(*descriptor))
+            if (buffer_len < sizeof(*descriptor))
             {
                 irp->IoStatus.u.Status = status = STATUS_BUFFER_TOO_SMALL;
                 break;
@@ -898,23 +899,18 @@ static NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
             break;
         }
         case IOCTL_HID_GET_REPORT_DESCRIPTOR:
-        {
-            DWORD length = irpsp->Parameters.DeviceIoControl.OutputBufferLength;
             TRACE("IOCTL_HID_GET_REPORT_DESCRIPTOR\n");
-
-            irp->IoStatus.u.Status = status = ext->vtbl->get_reportdescriptor(device, irp->UserBuffer, length, &length);
-            irp->IoStatus.Information = length;
+            irp->IoStatus.u.Status = status = ext->vtbl->get_reportdescriptor(device, irp->UserBuffer, buffer_len, &buffer_len);
+            irp->IoStatus.Information = buffer_len;
             break;
-        }
         case IOCTL_HID_GET_STRING:
         {
-            DWORD length = irpsp->Parameters.DeviceIoControl.OutputBufferLength / sizeof(WCHAR);
             DWORD index = (ULONG_PTR)irpsp->Parameters.DeviceIoControl.Type3InputBuffer;
             TRACE("IOCTL_HID_GET_STRING[%08x]\n", index);
 
-            irp->IoStatus.u.Status = status = hid_get_native_string(device, index, (WCHAR *)irp->UserBuffer, length);
+            irp->IoStatus.u.Status = status = hid_get_native_string(device, index, (WCHAR *)irp->UserBuffer, buffer_len / sizeof(WCHAR));
             if (status != STATUS_SUCCESS)
-                irp->IoStatus.u.Status = status = ext->vtbl->get_string(device, index, (WCHAR *)irp->UserBuffer, length);
+                irp->IoStatus.u.Status = status = ext->vtbl->get_string(device, index, (WCHAR *)irp->UserBuffer, buffer_len / sizeof(WCHAR));
             if (status == STATUS_SUCCESS)
                 irp->IoStatus.Information = (strlenW((WCHAR *)irp->UserBuffer) + 1) * sizeof(WCHAR);
             break;
@@ -950,8 +946,7 @@ static NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
             if (!ext->last_report_read)
             {
                 irp->IoStatus.u.Status = status = deliver_last_report(ext,
-                    irpsp->Parameters.DeviceIoControl.OutputBufferLength,
-                    irp->UserBuffer, &irp->IoStatus.Information);
+                    buffer_len, irp->UserBuffer, &irp->IoStatus.Information);
                 ext->last_report_read = TRUE;
             }
             else
@@ -991,12 +986,9 @@ static NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
             break;
         }
         default:
-        {
-            ULONG code = irpsp->Parameters.DeviceIoControl.IoControlCode;
             FIXME("Unsupported ioctl %x (device=%x access=%x func=%x method=%x)\n",
                   code, code >> 16, (code >> 14) & 3, (code >> 2) & 0xfff, code & 3);
             break;
-        }
     }
 
     LeaveCriticalSection(&ext->cs);
-- 
2.32.0




More information about the wine-devel mailing list