[PATCH 3/3] ole32: Fix memory leak in FileMonikerImpl_ComposeWith.
Alex Henrie
alexhenrie24 at gmail.com
Tue Mar 29 19:31:17 CDT 2016
Cc: André Hentschel <nerv at dawncrow.de>
Coverity #713616, "Variable strDec2 going out of scope leaks the storage
it points to."
Coverity #713617, "Variable strDec1 going out of scope leaks the storage
it points to."
Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
---
dlls/ole32/filemoniker.c | 51 ++++++++++++++++++++++++------------------------
1 file changed, 26 insertions(+), 25 deletions(-)
diff --git a/dlls/ole32/filemoniker.c b/dlls/ole32/filemoniker.c
index 9586be9..0013a93 100644
--- a/dlls/ole32/filemoniker.c
+++ b/dlls/ole32/filemoniker.c
@@ -693,40 +693,41 @@ FileMonikerImpl_ComposeWith(IMoniker* iface, IMoniker* pmkRight,
lastIdx1=FileMonikerImpl_DecomposePath(str1,&strDec1)-1;
lastIdx2=FileMonikerImpl_DecomposePath(str2,&strDec2)-1;
- if ((lastIdx1==-1 && lastIdx2>-1)||(lastIdx1==1 && lstrcmpW(strDec1[0],twoPoint)==0))
- return MK_E_SYNTAX;
-
- if(lstrcmpW(strDec1[lastIdx1],bkSlash)==0)
- lastIdx1--;
+ if ((lastIdx1==-1 && lastIdx2>-1)||(lastIdx1==1 && lstrcmpW(strDec1[0],twoPoint)==0)){
+ res = MK_E_SYNTAX;
+ }
+ else{
+ if(lstrcmpW(strDec1[lastIdx1],bkSlash)==0)
+ lastIdx1--;
- /* for etch "..\" in the left of str2 remove the right element from str1 */
- for(i=0; ( (lastIdx1>=0) && (strDec2[i]!=NULL) && (lstrcmpW(strDec2[i],twoPoint)==0) ) ;i+=2){
+ /* for each "..\" in the left of str2 remove the right element from str1 */
+ for(i=0; ( (lastIdx1>=0) && (strDec2[i]!=NULL) && (lstrcmpW(strDec2[i],twoPoint)==0) ); i+=2){
- lastIdx1-=2;
- }
+ lastIdx1-=2;
+ }
- /* the length of the composed path string is raised by the sum of the two paths lengths */
- newStr=HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(lstrlenW(str1)+lstrlenW(str2)+1));
+ /* the length of the composed path string is increased by the sum of the two paths' lengths */
+ newStr=HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(lstrlenW(str1)+lstrlenW(str2)+1));
- if (newStr)
- {
- /* new path is the concatenation of the rest of str1 and str2 */
- for(*newStr=0,j=0;j<=lastIdx1;j++)
- strcatW(newStr,strDec1[j]);
+ if (newStr){
+ /* new path is the concatenation of the rest of str1 and str2 */
+ for(*newStr=0,j=0;j<=lastIdx1;j++)
+ strcatW(newStr,strDec1[j]);
- if ((strDec2[i]==NULL && lastIdx1>-1 && lastIdx2>-1) || lstrcmpW(strDec2[i],bkSlash)!=0)
- strcatW(newStr,bkSlash);
+ if ((strDec2[i]==NULL && lastIdx1>-1 && lastIdx2>-1) || lstrcmpW(strDec2[i],bkSlash)!=0)
+ strcatW(newStr,bkSlash);
- for(j=i;j<=lastIdx2;j++)
- strcatW(newStr,strDec2[j]);
+ for(j=i;j<=lastIdx2;j++)
+ strcatW(newStr,strDec2[j]);
- /* create a new moniker with the new string */
- res=CreateFileMoniker(newStr,ppmkComposite);
+ /* create a new moniker with the new string */
+ res=CreateFileMoniker(newStr,ppmkComposite);
- /* free all strings space memory used by this function */
- HeapFree(GetProcessHeap(),0,newStr);
+ /* free string memory used by this function */
+ HeapFree(GetProcessHeap(),0,newStr);
+ }
+ else res = E_OUTOFMEMORY;
}
- else res = E_OUTOFMEMORY;
free_stringtable(strDec1);
free_stringtable(strDec2);
--
2.7.4
More information about the wine-patches
mailing list