diff --git a/dlls/ole32/filemoniker.c b/dlls/ole32/filemoniker.c index 9586be90e8c..3cd7da49ea4 100644 --- a/dlls/ole32/filemoniker.c +++ b/dlls/ole32/filemoniker.c @@ -694,40 +694,40 @@ FileMonikerImpl_ComposeWith(IMoniker* iface, IMoniker* pmkRight, lastIdx2=FileMonikerImpl_DecomposePath(str2,&strDec2)-1; if ((lastIdx1==-1 && lastIdx2>-1)||(lastIdx1==1 && lstrcmpW(strDec1[0],twoPoint)==0)) - return MK_E_SYNTAX; + res = MK_E_SYNTAX; + else{ + if(lstrcmpW(strDec1[lastIdx1],bkSlash)==0) + lastIdx1--; - if(lstrcmpW(strDec1[lastIdx1],bkSlash)==0) - lastIdx1--; + /* 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){ - /* 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){ + lastIdx1-=2; + } - lastIdx1-=2; + /* 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 ((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]); + + /* create a new moniker with the new string */ + res=CreateFileMoniker(newStr,ppmkComposite); + + /* free string memory used by this function */ + HeapFree(GetProcessHeap(),0,newStr); + } + else res = E_OUTOFMEMORY; } - /* 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)); - - 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); - - for(j=i;j<=lastIdx2;j++) - strcatW(newStr,strDec2[j]); - - /* 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); - } - else res = E_OUTOFMEMORY; - free_stringtable(strDec1); free_stringtable(strDec2);