Rémi Bernon : win32u: Use a static size array for rawinput device path.
Alexandre Julliard
julliard at winehq.org
Thu Jul 28 16:01:13 CDT 2022
Module: wine
Branch: master
Commit: 37a3c916b447bab5932ae202c053bceaba46e594
URL: https://gitlab.winehq.org/wine/wine/-/commit/37a3c916b447bab5932ae202c053bceaba46e594
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Sat Jun 25 21:53:16 2022 +0200
win32u: Use a static size array for rawinput device path.
---
dlls/win32u/rawinput.c | 22 ++++++++--------------
1 file changed, 8 insertions(+), 14 deletions(-)
diff --git a/dlls/win32u/rawinput.c b/dlls/win32u/rawinput.c
index 34accc3c4a0..b391bca1370 100644
--- a/dlls/win32u/rawinput.c
+++ b/dlls/win32u/rawinput.c
@@ -196,9 +196,9 @@ static bool rawinput_from_hardware_message( RAWINPUT *rawinput, const struct har
struct device
{
- WCHAR *path;
HANDLE file;
HANDLE handle;
+ WCHAR path[MAX_PATH];
RID_DEVICE_INFO info;
struct hid_preparsed_data *data;
};
@@ -238,7 +238,7 @@ static bool array_reserve( void **elements, unsigned int *capacity, unsigned int
static struct device *add_device( HKEY key, DWORD type )
{
static const WCHAR symbolic_linkW[] = {'S','y','m','b','o','l','i','c','L','i','n','k',0};
- char value_buffer[4096];
+ char value_buffer[offsetof(KEY_VALUE_PARTIAL_INFORMATION, Data[MAX_PATH * sizeof(WCHAR)])];
KEY_VALUE_PARTIAL_INFORMATION *value = (KEY_VALUE_PARTIAL_INFORMATION *)value_buffer;
static const RID_DEVICE_INFO_KEYBOARD keyboard_info = {0, 0, 1, 12, 3, 101};
static const RID_DEVICE_INFO_MOUSE mouse_info = {1, 5, 0, FALSE};
@@ -249,27 +249,24 @@ static struct device *add_device( HKEY key, DWORD type )
struct device *device;
RID_DEVICE_INFO info;
IO_STATUS_BLOCK io;
- WCHAR *path, *pos;
NTSTATUS status;
unsigned int i;
UINT32 handle;
void *buffer;
SIZE_T size;
HANDLE file;
+ WCHAR *path;
- if (!query_reg_value( key, symbolic_linkW, value, sizeof(value_buffer) ))
+ if (!query_reg_value( key, symbolic_linkW, value, sizeof(value_buffer) - sizeof(WCHAR) ))
{
ERR( "failed to get symbolic link value\n" );
return NULL;
}
-
- if (!(path = malloc( value->DataLength + sizeof(WCHAR) )))
- return NULL;
- memcpy( path, value->Data, value->DataLength );
- path[value->DataLength / sizeof(WCHAR)] = 0;
+ memset( value->Data + value->DataLength, 0, sizeof(WCHAR) );
/* upper case everything but the GUID */
- for (pos = path; *pos && *pos != '{'; pos++) *pos = towupper( *pos );
+ for (path = (WCHAR *)value->Data; *path && *path != '{'; path++) *path = towupper( *path );
+ path = (WCHAR *)value->Data;
/* path is in DOS format and begins with \\?\ prefix */
path[1] = '?';
@@ -280,7 +277,6 @@ static struct device *add_device( HKEY key, DWORD type )
FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SYNCHRONOUS_IO_NONALERT )))
{
ERR( "Failed to open device file %s, status %#x.\n", debugstr_w(path), status );
- free( path );
return NULL;
}
@@ -376,7 +372,7 @@ static struct device *add_device( HKEY key, DWORD type )
goto fail;
}
- device->path = path;
+ wcscpy( device->path, path );
device->file = file;
device->handle = ULongToHandle(handle);
device->info = info;
@@ -387,7 +383,6 @@ static struct device *add_device( HKEY key, DWORD type )
fail:
free( preparsed );
NtClose( file );
- free( path );
return NULL;
}
@@ -466,7 +461,6 @@ static void rawinput_update_device_list(void)
{
free( rawinput_devices[i].data );
NtClose( rawinput_devices[i].file );
- free( rawinput_devices[i].path );
}
rawinput_devices_count = 0;
More information about the wine-cvs
mailing list