Browse Source

device: fix stack corruption crashes on 32-bit Windows

rdb 6 years ago
parent
commit
22cac1cdf9

+ 2 - 2
panda/src/device/winInputDeviceManager.cxx

@@ -289,8 +289,8 @@ on_input_device_arrival(HANDLE handle) {
 
         // Some devices insert quite some trailing space here.
         wchar_t *wbuffer = (wchar_t *)buffer;
-        size_t wlen = wcslen(wbuffer);
-        while (iswspace(wbuffer[wlen - 1])) {
+        size_t wlen = wcsnlen_s(wbuffer, sizeof(buffer) / sizeof(wchar_t));
+        while (wlen > 0 && iswspace(wbuffer[wlen - 1])) {
           wbuffer[--wlen] = 0;
         }
         TextEncoder encoder;

+ 1 - 1
panda/src/device/winInputDeviceManager.h

@@ -54,7 +54,7 @@ private:
 
   static LRESULT WINAPI window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
 
-  typedef CONFIGRET (*pCM_Get_DevNode_Property)(DEVINST, const DEVPROPKEY *, DEVPROPTYPE *, PBYTE, PULONG, ULONG);
+  typedef CONFIGRET (WINAPI *pCM_Get_DevNode_Property)(DEVINST, const DEVPROPKEY *, DEVPROPTYPE *, PBYTE, PULONG, ULONG);
   pCM_Get_DevNode_Property _CM_Get_DevNode_PropertyW;
 
   friend class InputDeviceManager;

+ 5 - 5
panda/src/device/winRawInputDevice.cxx

@@ -159,11 +159,11 @@ typedef struct _HIDP_DATA {
 } HIDP_DATA, *PHIDP_DATA;
 
 typedef LONG NTSTATUS;
-typedef NTSTATUS (*pHidP_GetCaps)(PHIDP_PREPARSED_DATA, PHIDP_CAPS);
-typedef NTSTATUS (*pHidP_GetButtonCaps)(HIDP_REPORT_TYPE, PHIDP_BUTTON_CAPS, PUSHORT, PHIDP_PREPARSED_DATA);
-typedef NTSTATUS (*pHidP_GetValueCaps)(HIDP_REPORT_TYPE, PHIDP_VALUE_CAPS, PUSHORT, PHIDP_PREPARSED_DATA);
-typedef NTSTATUS (*pHidP_GetData)(HIDP_REPORT_TYPE, PHIDP_DATA, PULONG, PHIDP_PREPARSED_DATA, PCHAR, ULONG);
-typedef ULONG (*pHidP_MaxDataListLength)(HIDP_REPORT_TYPE, PHIDP_PREPARSED_DATA);
+typedef NTSTATUS (__stdcall *pHidP_GetCaps)(PHIDP_PREPARSED_DATA, PHIDP_CAPS);
+typedef NTSTATUS (__stdcall *pHidP_GetButtonCaps)(HIDP_REPORT_TYPE, PHIDP_BUTTON_CAPS, PUSHORT, PHIDP_PREPARSED_DATA);
+typedef NTSTATUS (__stdcall *pHidP_GetValueCaps)(HIDP_REPORT_TYPE, PHIDP_VALUE_CAPS, PUSHORT, PHIDP_PREPARSED_DATA);
+typedef NTSTATUS (__stdcall *pHidP_GetData)(HIDP_REPORT_TYPE, PHIDP_DATA, PULONG, PHIDP_PREPARSED_DATA, PCHAR, ULONG);
+typedef ULONG (__stdcall *pHidP_MaxDataListLength)(HIDP_REPORT_TYPE, PHIDP_PREPARSED_DATA);
 
 static pHidP_GetCaps _HidP_GetCaps = nullptr;
 static pHidP_GetButtonCaps _HidP_GetButtonCaps = nullptr;

+ 6 - 6
panda/src/device/xInputDevice.cxx

@@ -99,12 +99,12 @@ typedef struct _XINPUT_CAPABILITIES_EX {
   WORD Unknown2;
 } XINPUT_CAPABILITIES_EX;
 
-typedef DWORD (*pXInputGetState)(DWORD, XINPUT_STATE *);
-typedef DWORD (*pXInputSetState)(DWORD, XINPUT_VIBRATION *);
-typedef DWORD (*pXInputGetCapabilities)(DWORD, DWORD, XINPUT_CAPABILITIES *);
-typedef DWORD (*pXInputGetCapabilitiesEx)(DWORD, DWORD, DWORD, XINPUT_CAPABILITIES_EX *);
-typedef DWORD (*pXInputGetBatteryInformation)(DWORD, BYTE, XINPUT_BATTERY_INFORMATION *);
-typedef DWORD (*pXInputGetBaseBusInformation)(DWORD, XINPUT_BUSINFO *);
+typedef DWORD (WINAPI *pXInputGetState)(DWORD, XINPUT_STATE *);
+typedef DWORD (WINAPI *pXInputSetState)(DWORD, XINPUT_VIBRATION *);
+typedef DWORD (WINAPI *pXInputGetCapabilities)(DWORD, DWORD, XINPUT_CAPABILITIES *);
+typedef DWORD (WINAPI *pXInputGetCapabilitiesEx)(DWORD, DWORD, DWORD, XINPUT_CAPABILITIES_EX *);
+typedef DWORD (WINAPI *pXInputGetBatteryInformation)(DWORD, BYTE, XINPUT_BATTERY_INFORMATION *);
+typedef DWORD (WINAPI *pXInputGetBaseBusInformation)(DWORD, XINPUT_BUSINFO *);
 
 static pXInputGetState get_state = nullptr;
 static pXInputSetState set_state = nullptr;