dmloader: Release objects on error paths (Coverity).

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Signed-off-by: Michael Stefaniuc <mstefani@winehq.org>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
stable
Alistair Leslie-Hughes 2019-12-16 20:49:38 +01:00 committed by Alexandre Julliard
parent 3d62a461d0
commit 6e986bbd81
2 changed files with 16 additions and 3 deletions

View File

@ -384,18 +384,24 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_GetObject(IDirectMusicLoader8 *ifac
/* create object */ /* create object */
result = CoCreateInstance (&pDesc->guidClass, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicObject, (LPVOID*)&pObject); result = CoCreateInstance (&pDesc->guidClass, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicObject, (LPVOID*)&pObject);
if (FAILED(result)) { if (FAILED(result)) {
IStream_Release(pStream);
ERR(": could not create object\n"); ERR(": could not create object\n");
return result; return result;
} }
/* acquire PersistStream interface */ /* acquire PersistStream interface */
result = IDirectMusicObject_QueryInterface (pObject, &IID_IPersistStream, (LPVOID*)&pPersistStream); result = IDirectMusicObject_QueryInterface (pObject, &IID_IPersistStream, (LPVOID*)&pPersistStream);
if (FAILED(result)) { if (FAILED(result)) {
IStream_Release(pStream);
IDirectMusicObject_Release(pObject);
ERR("failed to Query\n"); ERR("failed to Query\n");
return result; return result;
} }
/* load */ /* load */
result = IPersistStream_Load (pPersistStream, pStream); result = IPersistStream_Load (pPersistStream, pStream);
if (result != S_OK) { if (result != S_OK) {
IStream_Release(pStream);
IPersistStream_Release(pPersistStream);
IDirectMusicObject_Release(pObject);
WARN(": failed to (completely) load object (%08x)\n", result); WARN(": failed to (completely) load object (%08x)\n", result);
return result; return result;
} }
@ -408,6 +414,9 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_GetObject(IDirectMusicLoader8 *ifac
lstrcpyW (GotDesc.wszFileName, pDesc->wszFileName); lstrcpyW (GotDesc.wszFileName, pDesc->wszFileName);
} }
if (FAILED(result)) { if (FAILED(result)) {
IStream_Release(pStream);
IPersistStream_Release(pPersistStream);
IDirectMusicObject_Release(pObject);
ERR(": failed to get descriptor\n"); ERR(": failed to get descriptor\n");
return result; return result;
} }
@ -524,6 +533,7 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_SetObject(IDirectMusicLoader8 *ifac
/* create object */ /* create object */
hr = CoCreateInstance (&pDesc->guidClass, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicObject, (LPVOID*)&pObject); hr = CoCreateInstance (&pDesc->guidClass, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicObject, (LPVOID*)&pObject);
if (FAILED(hr)) { if (FAILED(hr)) {
IStream_Release(pStream);
ERR("Object creation of %s failed 0x%08x\n", debugstr_guid(&pDesc->guidClass),hr); ERR("Object creation of %s failed 0x%08x\n", debugstr_guid(&pDesc->guidClass),hr);
return DMUS_E_LOADER_FAILEDOPEN; return DMUS_E_LOADER_FAILEDOPEN;
} }
@ -537,6 +547,8 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_SetObject(IDirectMusicLoader8 *ifac
/* hmph... due to some trouble I had with certain tests, we store current position and then set it back */ /* hmph... due to some trouble I had with certain tests, we store current position and then set it back */
DM_STRUCT_INIT(&Desc); DM_STRUCT_INIT(&Desc);
if (FAILED(IDirectMusicObject_ParseDescriptor (pObject, pStream, &Desc))) { if (FAILED(IDirectMusicObject_ParseDescriptor (pObject, pStream, &Desc))) {
IStream_Release(pStream);
IDirectMusicObject_Release(pObject);
ERR(": couldn't parse descriptor\n"); ERR(": couldn't parse descriptor\n");
return DMUS_E_LOADER_FORMATNOTSUPPORTED; return DMUS_E_LOADER_FORMATNOTSUPPORTED;
} }

View File

@ -663,10 +663,11 @@ static HRESULT WINAPI IDirectMusicLoaderGenericStream_IStream_Clone (LPSTREAM if
TRACE("(%p, %p)\n", iface, ppstm); TRACE("(%p, %p)\n", iface, ppstm);
result = DMUSIC_CreateDirectMusicLoaderGenericStream ((LPVOID*)&pOther); result = DMUSIC_CreateDirectMusicLoaderGenericStream ((LPVOID*)&pOther);
if (FAILED(result)) return result; if (FAILED(result)) return result;
if (FAILED(IStream_Clone (This->pStream, &pLowLevel))) if (FAILED(IStream_Clone (This->pStream, &pLowLevel))) {
IStream_Release(pOther);
return E_FAIL; return E_FAIL;
}
IDirectMusicLoaderGenericStream_Attach (pOther, pLowLevel, This->pLoader); IDirectMusicLoaderGenericStream_Attach (pOther, pLowLevel, This->pLoader);
TRACE(": succeeded\n"); TRACE(": succeeded\n");