winebus.sys: Avoid process heap allocations on the unix side.
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
e54ff70e5d
commit
8f6932fd35
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue