Rémi Bernon : winebus.sys: Avoid process heap allocations on the unix side.

Alexandre Julliard julliard at winehq.org
Fri Sep 17 16:03:07 CDT 2021


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

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Fri Sep 17 08:50:32 2021 +0200

winebus.sys: Avoid process heap allocations on the unix side.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winebus.sys/bus_iohid.c |  2 +-
 dlls/winebus.sys/bus_sdl.c   | 10 ++++------
 dlls/winebus.sys/bus_udev.c  | 14 ++++++--------
 dlls/winebus.sys/hid.c       |  8 ++++----
 dlls/winebus.sys/unixlib.c   | 16 +++++++++-------
 5 files changed, 24 insertions(+), 26 deletions(-)

diff --git a/dlls/winebus.sys/bus_iohid.c b/dlls/winebus.sys/bus_iohid.c
index 0e36eac880c..70a7cd0b005 100644
--- a/dlls/winebus.sys/bus_iohid.c
+++ b/dlls/winebus.sys/bus_iohid.c
@@ -172,7 +172,7 @@ static NTSTATUS iohid_device_start(struct unix_device *iface)
 
     num = IOHIDDeviceGetProperty(private->device, CFSTR(kIOHIDMaxInputReportSizeKey));
     length = CFNumberToDWORD(num);
-    private->buffer = RtlAllocateHeap(GetProcessHeap(), 0, length);
+    private->buffer = malloc(length);
 
     IOHIDDeviceRegisterInputReportCallback(private->device, private->buffer, length, handle_IOHIDDeviceIOHIDReportCallback, iface);
     return STATUS_SUCCESS;
diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c
index 79dff5007c0..956340faf02 100644
--- a/dlls/winebus.sys/bus_sdl.c
+++ b/dlls/winebus.sys/bus_sdl.c
@@ -374,8 +374,7 @@ static NTSTATUS build_report_descriptor(struct platform_private *ext)
         return STATUS_NO_MEMORY;
 
     ext->buffer_length = report_size;
-    if (!(ext->report_buffer = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, report_size)))
-        goto failed;
+    if (!(ext->report_buffer = calloc(1, report_size))) goto failed;
 
     /* Initialize axis in the report */
     for (i = 0; i < axis_count; i++)
@@ -386,7 +385,7 @@ static NTSTATUS build_report_descriptor(struct platform_private *ext)
     return STATUS_SUCCESS;
 
 failed:
-    RtlFreeHeap(GetProcessHeap(), 0, ext->report_buffer);
+    free(ext->report_buffer);
     hid_descriptor_free(&ext->desc);
     return STATUS_NO_MEMORY;
 }
@@ -475,8 +474,7 @@ static NTSTATUS build_mapped_report_descriptor(struct platform_private *ext)
     if (!hid_descriptor_end(&ext->desc))
         return STATUS_NO_MEMORY;
 
-    if (!(ext->report_buffer = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, ext->buffer_length)))
-        goto failed;
+    if (!(ext->report_buffer = calloc(1, ext->buffer_length))) goto failed;
 
     /* Initialize axis in the report */
     for (i = SDL_CONTROLLER_AXIS_LEFTX; i < SDL_CONTROLLER_AXIS_MAX; i++)
@@ -491,7 +489,7 @@ static NTSTATUS build_mapped_report_descriptor(struct platform_private *ext)
     return STATUS_SUCCESS;
 
 failed:
-    RtlFreeHeap(GetProcessHeap(), 0, ext->report_buffer);
+    free(ext->report_buffer);
     hid_descriptor_free(&ext->desc);
     return STATUS_NO_MEMORY;
 }
diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c
index c859d5df546..928548b8893 100644
--- a/dlls/winebus.sys/bus_udev.c
+++ b/dlls/winebus.sys/bus_udev.c
@@ -548,10 +548,8 @@ static NTSTATUS build_report_descriptor(struct wine_input_private *ext, struct u
     TRACE("Report will be %i bytes\n", report_size);
 
     ext->buffer_length = report_size;
-    if (!(ext->current_report_buffer = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, report_size)))
-        goto failed;
-    if (!(ext->last_report_buffer = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, report_size)))
-        goto failed;
+    if (!(ext->current_report_buffer = calloc(1, report_size))) goto failed;
+    if (!(ext->last_report_buffer = calloc(1, report_size))) goto failed;
     ext->report_state = FIRST;
 
     /* Initialize axis in the report */
@@ -562,8 +560,8 @@ static NTSTATUS build_report_descriptor(struct wine_input_private *ext, struct u
     return STATUS_SUCCESS;
 
 failed:
-    RtlFreeHeap(GetProcessHeap(), 0, ext->current_report_buffer);
-    RtlFreeHeap(GetProcessHeap(), 0, ext->last_report_buffer);
+    free(ext->current_report_buffer);
+    free(ext->last_report_buffer);
     hid_descriptor_free(&ext->desc);
     return STATUS_NO_MEMORY;
 }
@@ -811,8 +809,8 @@ static void lnxev_device_destroy(struct unix_device *iface)
 {
     struct wine_input_private *ext = input_impl_from_unix_device(iface);
 
-    RtlFreeHeap(GetProcessHeap(), 0, ext->current_report_buffer);
-    RtlFreeHeap(GetProcessHeap(), 0, ext->last_report_buffer);
+    free(ext->current_report_buffer);
+    free(ext->last_report_buffer);
     hid_descriptor_free(&ext->desc);
 
     udev_device_unref(ext->base.udev_device);
diff --git a/dlls/winebus.sys/hid.c b/dlls/winebus.sys/hid.c
index 959cbf7c428..0ad5efa2775 100644
--- a/dlls/winebus.sys/hid.c
+++ b/dlls/winebus.sys/hid.c
@@ -23,6 +23,7 @@
 #endif
 
 #include <stdarg.h>
+#include <stdlib.h>
 
 #include "ntstatus.h"
 #define WIN32_NO_STATUS
@@ -40,13 +41,12 @@ static BOOL hid_descriptor_append(struct hid_descriptor *desc, const BYTE *buffe
     if (desc->size + size > desc->max_size)
     {
         desc->max_size = max(desc->max_size * 3 / 2, desc->size + size);
-        if (!desc->data) desc->data = RtlAllocateHeap(GetProcessHeap(), 0, desc->max_size);
-        else desc->data = RtlReAllocateHeap(GetProcessHeap(), 0, tmp, desc->max_size);
+        desc->data = realloc(tmp, desc->max_size);
     }
 
     if (!desc->data)
     {
-        RtlFreeHeap(GetProcessHeap(), 0, tmp);
+        free(tmp);
         return FALSE;
     }
 
@@ -93,7 +93,7 @@ BOOL hid_descriptor_end(struct hid_descriptor *desc)
 
 void hid_descriptor_free(struct hid_descriptor *desc)
 {
-    RtlFreeHeap(GetProcessHeap(), 0, desc->data);
+    free(desc->data);
 }
 
 BOOL hid_descriptor_add_buttons(struct hid_descriptor *desc, USAGE usage_page,
diff --git a/dlls/winebus.sys/unixlib.c b/dlls/winebus.sys/unixlib.c
index f21b5a25b04..f33b7cacfe3 100644
--- a/dlls/winebus.sys/unixlib.c
+++ b/dlls/winebus.sys/unixlib.c
@@ -23,6 +23,8 @@
 #include "config.h"
 
 #include <stdarg.h>
+#include <stdlib.h>
+
 #include "ntstatus.h"
 #define WIN32_NO_STATUS
 #include "windef.h"
@@ -257,7 +259,7 @@ void *unix_device_create(const struct unix_device_vtbl *vtbl, SIZE_T size)
 {
     struct unix_device *iface;
 
-    if (!(iface = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, size))) return NULL;
+    if (!(iface = calloc(1, size))) return NULL;
     iface->vtbl = vtbl;
     iface->ref = 1;
 
@@ -269,7 +271,7 @@ static void unix_device_decref(struct unix_device *iface)
     if (!InterlockedDecrement(&iface->ref))
     {
         iface->vtbl->destroy(iface);
-        RtlFreeHeap(GetProcessHeap(), 0, iface);
+        free(iface);
     }
 }
 
@@ -357,14 +359,14 @@ void bus_event_queue_destroy(struct list *queue)
     LIST_FOR_EACH_ENTRY_SAFE(event, next, queue, struct bus_event, entry)
     {
         bus_event_cleanup(event);
-        RtlFreeHeap(GetProcessHeap(), 0, event);
+        free(event);
     }
 }
 
 BOOL bus_event_queue_device_removed(struct list *queue, struct unix_device *device)
 {
     ULONG size = sizeof(struct bus_event);
-    struct bus_event *event = RtlAllocateHeap(GetProcessHeap(), 0, size);
+    struct bus_event *event = malloc(size);
     if (!event) return FALSE;
 
     if (unix_device_incref(device) == 1) return FALSE; /* being destroyed */
@@ -379,7 +381,7 @@ BOOL bus_event_queue_device_removed(struct list *queue, struct unix_device *devi
 BOOL bus_event_queue_device_created(struct list *queue, struct unix_device *device, struct device_desc *desc)
 {
     ULONG size = sizeof(struct bus_event);
-    struct bus_event *event = RtlAllocateHeap(GetProcessHeap(), 0, size);
+    struct bus_event *event = malloc(size);
     if (!event) return FALSE;
 
     if (unix_device_incref(device) == 1) return FALSE; /* being destroyed */
@@ -395,7 +397,7 @@ BOOL bus_event_queue_device_created(struct list *queue, struct unix_device *devi
 BOOL bus_event_queue_input_report(struct list *queue, struct unix_device *device, BYTE *report, USHORT length)
 {
     ULONG size = offsetof(struct bus_event, input_report.buffer[length]);
-    struct bus_event *event = RtlAllocateHeap(GetProcessHeap(), 0, size);
+    struct bus_event *event = malloc(size);
     if (!event) return FALSE;
 
     if (unix_device_incref(device) == 1) return FALSE; /* being destroyed */
@@ -424,7 +426,7 @@ BOOL bus_event_queue_pop(struct list *queue, struct bus_event *event)
     else size = offsetof(struct bus_event, input_report.buffer[event->input_report.length]);
 
     memcpy(event, tmp, size);
-    RtlFreeHeap(GetProcessHeap(), 0, tmp);
+    free(tmp);
 
     return TRUE;
 }




More information about the wine-cvs mailing list