From ad8e3727c13d19c8ce79aad1ef00c33a3fab2a2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Fri, 28 May 2021 11:41:26 +0200 Subject: [PATCH] dinput: Make device creation error handling consistent. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: RĂ©mi Bernon Signed-off-by: Alexandre Julliard --- dlls/dinput/joystick_linux.c | 21 +++++++-------------- dlls/dinput/joystick_linuxinput.c | 15 ++++++++------- dlls/dinput/joystick_osx.c | 21 +++++++-------------- dlls/dinput/keyboard.c | 15 +++++++++------ dlls/dinput/mouse.c | 16 +++++++++------- 5 files changed, 40 insertions(+), 48 deletions(-) diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c index a33b16454b0..14074bb176c 100644 --- a/dlls/dinput/joystick_linux.c +++ b/dlls/dinput/joystick_linux.c @@ -451,8 +451,7 @@ static HRESULT joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINS return S_FALSE; } -static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput, - JoystickImpl **pdev, unsigned short index) +static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, JoystickImpl **out, unsigned short index ) { DWORD i; JoystickImpl* newDevice; @@ -461,14 +460,10 @@ static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput, int idx = 0; DIDEVICEINSTANCEW ddi; - TRACE("%s %p %p %hu\n", debugstr_guid(rguid), dinput, pdev, index); + TRACE( "%s %p %p %hu\n", debugstr_guid( rguid ), dinput, out, index ); newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickImpl)); - if (newDevice == 0) { - WARN("out of memory\n"); - *pdev = 0; - return DIERR_OUTOFMEMORY; - } + if (!newDevice) return DIERR_OUTOFMEMORY; newDevice->joydev = &joystick_devices[index]; newDevice->joyfd = -1; @@ -564,8 +559,7 @@ static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput, _dump_DIDEVCAPS(&newDevice->generic.devcaps); } - *pdev = newDevice; - + *out = newDevice; return DI_OK; FAILED: @@ -576,8 +570,6 @@ FAILED1: release_DataFormat(&newDevice->generic.base.data_format); HeapFree(GetProcessHeap(),0,newDevice->generic.axis_map); HeapFree(GetProcessHeap(),0,newDevice); - *pdev = 0; - return hr; } @@ -641,8 +633,9 @@ static HRESULT joydev_create_device(IDirectInputImpl *dinput, REFGUID rguid, REF return DIERR_NOINTERFACE; } - hr = alloc_device(rguid, dinput, &This, index); - if (!This) return hr; + if (FAILED(hr = alloc_device( rguid, dinput, &This, index ))) return hr; + + TRACE( "Created a Joystick device (%p)\n", This ); if (unicode) *pdev = &This->generic.base.IDirectInputDevice8W_iface; diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c index 2e2c8a87261..95b2df81ece 100644 --- a/dlls/dinput/joystick_linuxinput.c +++ b/dlls/dinput/joystick_linuxinput.c @@ -444,7 +444,7 @@ static HRESULT joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINS return S_FALSE; } -static JoystickImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput, unsigned short index) +static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, JoystickImpl **out, unsigned short index ) { JoystickImpl* newDevice; LPDIDATAFORMAT df = NULL; @@ -453,7 +453,7 @@ static JoystickImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput, unsig DIDEVICEINSTANCEW ddi; newDevice = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(JoystickImpl)); - if (!newDevice) return NULL; + if (!newDevice) return DIERR_OUTOFMEMORY; newDevice->generic.base.IDirectInputDevice8A_iface.lpVtbl = &JoystickAvt; newDevice->generic.base.IDirectInputDevice8W_iface.lpVtbl = &JoystickWvt; @@ -584,14 +584,15 @@ static JoystickImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput, unsig IDirectInput_AddRef(&newDevice->generic.base.dinput->IDirectInput7A_iface); - return newDevice; + *out = newDevice; + return DI_OK; failed: if (df) HeapFree(GetProcessHeap(), 0, df->rgodf); HeapFree(GetProcessHeap(), 0, df); HeapFree(GetProcessHeap(), 0, newDevice->generic.axis_map); HeapFree(GetProcessHeap(), 0, newDevice); - return NULL; + return DIERR_OUTOFMEMORY; } /****************************************************************************** @@ -630,6 +631,7 @@ static HRESULT joydev_create_device(IDirectInputImpl *dinput, REFGUID rguid, REF have_joydevs && index < have_joydevs) { JoystickImpl *This; + HRESULT hr; if (riid == NULL) ;/* nothing */ @@ -653,10 +655,9 @@ static HRESULT joydev_create_device(IDirectInputImpl *dinput, REFGUID rguid, REF return DIERR_NOINTERFACE; } - This = alloc_device(rguid, dinput, index); - TRACE("Created a Joystick device (%p)\n", This); + if (FAILED(hr = alloc_device( rguid, dinput, &This, index ))) return hr; - if (!This) return DIERR_OUTOFMEMORY; + TRACE( "Created a Joystick device (%p)\n", This ); if (unicode) *pdev = &This->generic.base.IDirectInputDevice8W_iface; diff --git a/dlls/dinput/joystick_osx.c b/dlls/dinput/joystick_osx.c index e2212557180..65d0a4a36eb 100644 --- a/dlls/dinput/joystick_osx.c +++ b/dlls/dinput/joystick_osx.c @@ -1105,8 +1105,7 @@ static BOOL osx_axis_has_ff(FFCAPABILITIES *ffcaps, UInt8 axis) return FALSE; } -static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput, - JoystickImpl **pdev, unsigned short index) +static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, JoystickImpl **out, unsigned short index ) { DWORD i; IOHIDDeviceRef device; @@ -1119,14 +1118,10 @@ static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput, int slider_count = 0; FFCAPABILITIES ffcaps; - TRACE("%s %p %p %hu\n", debugstr_guid(rguid), dinput, pdev, index); + TRACE( "%s %p %p %hu\n", debugstr_guid( rguid ), dinput, out, index ); newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickImpl)); - if (newDevice == 0) { - WARN("out of memory\n"); - *pdev = 0; - return DIERR_OUTOFMEMORY; - } + if (!newDevice) return DIERR_OUTOFMEMORY; newDevice->id = index; @@ -1287,8 +1282,7 @@ static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput, _dump_DIDEVCAPS(&newDevice->generic.devcaps); } - *pdev = newDevice; - + *out = newDevice; return DI_OK; FAILED: @@ -1300,8 +1294,6 @@ FAILED: release_DataFormat(&newDevice->generic.base.data_format); HeapFree(GetProcessHeap(),0,newDevice->generic.name); HeapFree(GetProcessHeap(),0,newDevice); - *pdev = 0; - return hr; } @@ -1380,8 +1372,9 @@ static HRESULT joydev_create_device(IDirectInputImpl *dinput, REFGUID rguid, REF return DIERR_NOINTERFACE; } - hr = alloc_device(rguid, dinput, &This, index); - if (!This) return hr; + if (FAILED(hr = alloc_device( rguid, dinput, &This, index ))) return hr; + + TRACE( "Created a Joystick device (%p)\n", This ); if (unicode) *pdev = &This->generic.base.IDirectInputDevice8W_iface; diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c index 9d4ceda3edc..e9fa9eb8cbc 100644 --- a/dlls/dinput/keyboard.c +++ b/dlls/dinput/keyboard.c @@ -240,13 +240,15 @@ static HRESULT keyboarddev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVI return S_FALSE; } -static SysKeyboardImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput) +static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, SysKeyboardImpl **out ) { SysKeyboardImpl* newDevice; LPDIDATAFORMAT df = NULL; int i, idx = 0; newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysKeyboardImpl)); + if (!newDevice) return DIERR_OUTOFMEMORY; + newDevice->base.IDirectInputDevice8A_iface.lpVtbl = &SysKeyboardAvt; newDevice->base.IDirectInputDevice8W_iface.lpVtbl = &SysKeyboardWvt; newDevice->base.ref = 1; @@ -278,13 +280,14 @@ static SysKeyboardImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput) newDevice->base.data_format.wine_df = df; IDirectInput_AddRef(&newDevice->base.dinput->IDirectInput7A_iface); - return newDevice; + *out = newDevice; + return DI_OK; failed: if (df) HeapFree(GetProcessHeap(), 0, df->rgodf); HeapFree(GetProcessHeap(), 0, df); HeapFree(GetProcessHeap(), 0, newDevice); - return NULL; + return DIERR_OUTOFMEMORY; } @@ -296,6 +299,7 @@ static HRESULT keyboarddev_create_device(IDirectInputImpl *dinput, REFGUID rguid if (IsEqualGUID(&GUID_SysKeyboard, rguid)) /* Wine Keyboard */ { SysKeyboardImpl *This; + HRESULT hr; if (riid == NULL) ;/* nothing */ @@ -319,10 +323,9 @@ static HRESULT keyboarddev_create_device(IDirectInputImpl *dinput, REFGUID rguid return DIERR_NOINTERFACE; } - This = alloc_device(rguid, dinput); - TRACE("Created a Keyboard device (%p)\n", This); + if (FAILED(hr = alloc_device( rguid, dinput, &This ))) return hr; - if (!This) return DIERR_OUTOFMEMORY; + TRACE( "Created a Keyboard device (%p)\n", This ); if (unicode) *pdev = &This->base.IDirectInputDevice8W_iface; diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c index e5bd697a0ea..e789d260e5a 100644 --- a/dlls/dinput/mouse.c +++ b/dlls/dinput/mouse.c @@ -184,7 +184,7 @@ static HRESULT mousedev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEI return S_FALSE; } -static SysMouseImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput) +static HRESULT alloc_device( REFGUID rguid, IDirectInputImpl *dinput, SysMouseImpl **out ) { SysMouseImpl* newDevice; LPDIDATAFORMAT df = NULL; @@ -193,7 +193,8 @@ static SysMouseImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput) HKEY hkey, appkey; newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysMouseImpl)); - if (!newDevice) return NULL; + if (!newDevice) return DIERR_OUTOFMEMORY; + newDevice->base.IDirectInputDevice8A_iface.lpVtbl = &SysMouseAvt; newDevice->base.IDirectInputDevice8W_iface.lpVtbl = &SysMouseWvt; newDevice->base.ref = 1; @@ -237,13 +238,14 @@ static SysMouseImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput) newDevice->base.raw_device.usUsage = 2; /* HID generic mouse */ } - return newDevice; + *out = newDevice; + return DI_OK; failed: if (df) HeapFree(GetProcessHeap(), 0, df->rgodf); HeapFree(GetProcessHeap(), 0, df); HeapFree(GetProcessHeap(), 0, newDevice); - return NULL; + return DIERR_OUTOFMEMORY; } static HRESULT mousedev_create_device(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPVOID *pdev, int unicode) @@ -254,6 +256,7 @@ static HRESULT mousedev_create_device(IDirectInputImpl *dinput, REFGUID rguid, R if (IsEqualGUID(&GUID_SysMouse, rguid)) /* Wine Mouse */ { SysMouseImpl *This; + HRESULT hr; if (riid == NULL) ;/* nothing */ @@ -277,10 +280,9 @@ static HRESULT mousedev_create_device(IDirectInputImpl *dinput, REFGUID rguid, R return DIERR_NOINTERFACE; } - This = alloc_device(rguid, dinput); - TRACE("Created a Mouse device (%p)\n", This); + if (FAILED(hr = alloc_device( rguid, dinput, &This ))) return hr; - if (!This) return DIERR_OUTOFMEMORY; + TRACE( "Created a Mouse device (%p)\n", This ); if (unicode) *pdev = &This->base.IDirectInputDevice8W_iface;