[PATCH 3/4] dinput: Check cbTypeSpecificParams before lpvTypeSpecificParams.
Rémi Bernon
rbernon at codeweavers.com
Fri Dec 3 07:08:48 CST 2021
From: Ivo Ivanov <logos128 at gmail.com>
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>
---
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:
--
2.34.0
More information about the wine-devel
mailing list