Ivo Ivanov : dinput: Check cbTypeSpecificParams before lpvTypeSpecificParams.
Alexandre Julliard
julliard at winehq.org
Fri Dec 3 15:18:59 CST 2021
Module: wine
Branch: master
Commit: 5ce61fc04f2c274e3cccf12cccfe0757c9927383
URL: https://source.winehq.org/git/wine.git/?a=commit;h=5ce61fc04f2c274e3cccf12cccfe0757c9927383
Author: Ivo Ivanov <logos128 at gmail.com>
Date: Fri Dec 3 14:08:48 2021 +0100
dinput: Check cbTypeSpecificParams before lpvTypeSpecificParams.
And return DIERR_MOREDATA the provided buffer is too short.
Fixes the WheelCheck application not showing type specific params
for Constant and Periodic effects.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dinput/joystick_hid.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index 86bb31737ab..56ef9ef6ce2 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -2419,28 +2419,34 @@ static HRESULT WINAPI hid_joystick_effect_GetParameters( IDirectInputEffect *ifa
case PID_USAGE_ET_TRIANGLE:
case PID_USAGE_ET_SAWTOOTH_UP:
case PID_USAGE_ET_SAWTOOTH_DOWN:
+ capacity = params->cbTypeSpecificParams;
+ params->cbTypeSpecificParams = sizeof(DIPERIODIC);
+ if (capacity < sizeof(DIPERIODIC)) return DIERR_MOREDATA;
if (!params->lpvTypeSpecificParams) return E_POINTER;
- if (params->cbTypeSpecificParams != sizeof(DIPERIODIC)) return DIERR_INVALIDPARAM;
memcpy( params->lpvTypeSpecificParams, impl->params.lpvTypeSpecificParams, sizeof(DIPERIODIC) );
break;
case PID_USAGE_ET_SPRING:
case PID_USAGE_ET_DAMPER:
case PID_USAGE_ET_INERTIA:
case PID_USAGE_ET_FRICTION:
- count = impl->params.cbTypeSpecificParams;
capacity = params->cbTypeSpecificParams;
- params->cbTypeSpecificParams = count;
- if (capacity < count) return DIERR_MOREDATA;
+ params->cbTypeSpecificParams = impl->params.cbTypeSpecificParams;
+ if (capacity < impl->params.cbTypeSpecificParams) return DIERR_MOREDATA;
+ if (!params->lpvTypeSpecificParams) return E_POINTER;
memcpy( params->lpvTypeSpecificParams, impl->params.lpvTypeSpecificParams, params->cbTypeSpecificParams );
break;
case PID_USAGE_ET_CONSTANT_FORCE:
+ capacity = params->cbTypeSpecificParams;
+ params->cbTypeSpecificParams = sizeof(DICONSTANTFORCE);
+ if (capacity < sizeof(DICONSTANTFORCE)) return DIERR_MOREDATA;
if (!params->lpvTypeSpecificParams) return E_POINTER;
- if (params->cbTypeSpecificParams != sizeof(DICONSTANTFORCE)) return DIERR_INVALIDPARAM;
memcpy( params->lpvTypeSpecificParams, impl->params.lpvTypeSpecificParams, sizeof(DICONSTANTFORCE) );
break;
case PID_USAGE_ET_RAMP:
+ capacity = params->cbTypeSpecificParams;
+ params->cbTypeSpecificParams = sizeof(DIRAMPFORCE);
+ if (capacity < sizeof(DIRAMPFORCE)) return DIERR_MOREDATA;
if (!params->lpvTypeSpecificParams) return E_POINTER;
- if (params->cbTypeSpecificParams != sizeof(DIRAMPFORCE)) return DIERR_INVALIDPARAM;
memcpy( params->lpvTypeSpecificParams, impl->params.lpvTypeSpecificParams, sizeof(DIRAMPFORCE) );
break;
case PID_USAGE_ET_CUSTOM_FORCE_DATA:
More information about the wine-cvs
mailing list