Nikolay Sivov : ole32: Fix leaks on error paths (Coverity).
Alexandre Julliard
julliard at winehq.org
Tue Mar 25 14:27:43 CDT 2014
Module: wine
Branch: master
Commit: 4768ac4413e85a459457903c4fdf8388143f22a0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4768ac4413e85a459457903c4fdf8388143f22a0
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue Mar 25 07:58:08 2014 +0400
ole32: Fix leaks on error paths (Coverity).
---
dlls/ole32/filemoniker.c | 132 +++++++++++++++++++++++-----------------------
1 file changed, 66 insertions(+), 66 deletions(-)
diff --git a/dlls/ole32/filemoniker.c b/dlls/ole32/filemoniker.c
index af161fe..06c4798 100644
--- a/dlls/ole32/filemoniker.c
+++ b/dlls/ole32/filemoniker.c
@@ -935,11 +935,12 @@ static HRESULT WINAPI
FileMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther,IMoniker** ppmkPrefix)
{
- LPOLESTR pathThis,pathOther,*stringTable1,*stringTable2,commonPath;
- IBindCtx *pbind;
+ LPOLESTR pathThis = NULL, pathOther = NULL,*stringTable1,*stringTable2,commonPath = NULL;
+ IBindCtx *bindctx;
DWORD mkSys;
ULONG nb1,nb2,i,sameIdx;
BOOL machineNameCase = FALSE;
+ HRESULT ret;
if (ppmkPrefix==NULL)
return E_POINTER;
@@ -951,81 +952,81 @@ FileMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther,IMoniker** p
/* check if we have the same type of moniker */
IMoniker_IsSystemMoniker(pmkOther,&mkSys);
+ if (mkSys != MKSYS_FILEMONIKER)
+ return MonikerCommonPrefixWith(iface, pmkOther, ppmkPrefix);
- if(mkSys==MKSYS_FILEMONIKER){
- HRESULT ret;
-
- ret = CreateBindCtx(0,&pbind);
- if (FAILED(ret))
- return ret;
-
- /* create a string based on common part of the two paths */
-
- ret = IMoniker_GetDisplayName(iface,pbind,NULL,&pathThis);
- if (FAILED(ret))
- return ret;
- ret = IMoniker_GetDisplayName(pmkOther,pbind,NULL,&pathOther);
- if (FAILED(ret))
- return ret;
-
- nb1=FileMonikerImpl_DecomposePath(pathThis,&stringTable1);
- if (FAILED(nb1))
- return nb1;
- nb2=FileMonikerImpl_DecomposePath(pathOther,&stringTable2);
- if (FAILED(nb2))
- {
- free_stringtable(stringTable1);
- return nb2;
- }
-
- if (nb1==0 || nb2==0)
- {
- free_stringtable(stringTable1);
- free_stringtable(stringTable2);
- return MK_E_NOPREFIX;
- }
-
- commonPath=HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(min(lstrlenW(pathThis),lstrlenW(pathOther))+1));
- if (!commonPath)
- return E_OUTOFMEMORY;
+ ret = CreateBindCtx(0, &bindctx);
+ if (FAILED(ret))
+ return ret;
- *commonPath=0;
+ /* create a string based on common part of the two paths */
+ ret = IMoniker_GetDisplayName(iface, bindctx, NULL, &pathThis);
+ if (FAILED(ret))
+ goto failed;
- for(sameIdx=0; ( (stringTable1[sameIdx]!=NULL) &&
- (stringTable2[sameIdx]!=NULL) &&
- (lstrcmpiW(stringTable1[sameIdx],stringTable2[sameIdx])==0)); sameIdx++);
+ ret = IMoniker_GetDisplayName(pmkOther, bindctx, NULL, &pathOther);
+ if (FAILED(ret))
+ goto failed;
- if (sameIdx > 1 && *stringTable1[0]=='\\' && *stringTable2[1]=='\\'){
+ nb1 = FileMonikerImpl_DecomposePath(pathThis, &stringTable1);
+ if (FAILED(nb1)) {
+ ret = nb1;
+ goto failed;
+ }
- machineNameCase = TRUE;
+ nb2 = FileMonikerImpl_DecomposePath(pathOther, &stringTable2);
+ if (FAILED(nb2)) {
+ ret = nb2;
+ goto failed;
+ }
- for(i=2;i<sameIdx;i++)
+ if (nb1 == 0 || nb2 == 0) {
+ ret = MK_E_NOPREFIX;
+ goto failed;
+ }
- if( (*stringTable1[i]=='\\') && (i+1 < sameIdx) && (*stringTable1[i+1]=='\\') ){
- machineNameCase = FALSE;
- break;
- }
- }
+ commonPath = CoTaskMemAlloc(sizeof(WCHAR)*(min(lstrlenW(pathThis),lstrlenW(pathOther))+1));
+ if (!commonPath) {
+ ret = E_OUTOFMEMORY;
+ goto failed;
+ }
- if (machineNameCase && *stringTable1[sameIdx-1]=='\\')
- sameIdx--;
+ *commonPath = 0;
+ for(sameIdx=0; ( (stringTable1[sameIdx]!=NULL) &&
+ (stringTable2[sameIdx]!=NULL) &&
+ (lstrcmpiW(stringTable1[sameIdx],stringTable2[sameIdx])==0)); sameIdx++);
- if (machineNameCase && (sameIdx<=3) && (nb1 > 3 || nb2 > 3) )
- ret = MK_E_NOPREFIX;
- else
- {
- for(i=0;i<sameIdx;i++)
- strcatW(commonPath,stringTable1[i]);
+ if (sameIdx > 1 && *stringTable1[0]=='\\' && *stringTable2[1]=='\\'){
+ machineNameCase = TRUE;
- free_stringtable(stringTable1);
- free_stringtable(stringTable2);
- ret = CreateFileMoniker(commonPath,ppmkPrefix);
+ for(i=2;i<sameIdx;i++)
+ if( (*stringTable1[i]=='\\') && (i+1 < sameIdx) && (*stringTable1[i+1]=='\\') ){
+ machineNameCase = FALSE;
+ break;
}
- HeapFree(GetProcessHeap(),0,commonPath);
- return ret;
}
+
+ if (machineNameCase && *stringTable1[sameIdx-1]=='\\')
+ sameIdx--;
+
+ if (machineNameCase && (sameIdx<=3) && (nb1 > 3 || nb2 > 3) )
+ ret = MK_E_NOPREFIX;
else
- return MonikerCommonPrefixWith(iface,pmkOther,ppmkPrefix);
+ {
+ for (i = 0; i < sameIdx; i++)
+ strcatW(commonPath,stringTable1[i]);
+ ret = CreateFileMoniker(commonPath, ppmkPrefix);
+ }
+
+failed:
+ IBindCtx_Release(bindctx);
+ CoTaskMemFree(pathThis);
+ CoTaskMemFree(pathOther);
+ CoTaskMemFree(commonPath);
+ free_stringtable(stringTable1);
+ free_stringtable(stringTable2);
+
+ return ret;
}
/******************************************************************************
@@ -1105,8 +1106,7 @@ lend:
CoTaskMemFree(strgtable);
}
- if (word)
- CoTaskMemFree(word);
+ CoTaskMemFree(word);
return ret;
}
More information about the wine-cvs
mailing list