Module: wine Branch: master Commit: c2fdea600ab19822ecd23441838900fc6699c2ef URL: http://source.winehq.org/git/wine.git/?a=commit;h=c2fdea600ab19822ecd2344183...
Author: Ulrich Czekalla ulrich.czekalla@utoronto.ca Date: Thu Jun 7 13:43:41 2007 -0400
ole32: Remove stack-based string buffer inFileMonikerImpl_DecomposePath.
---
dlls/ole32/filemoniker.c | 40 ++++++++++++++++++++++++++++++++++------ 1 files changed, 34 insertions(+), 6 deletions(-)
diff --git a/dlls/ole32/filemoniker.c b/dlls/ole32/filemoniker.c index 7578836..4ef7d59 100644 --- a/dlls/ole32/filemoniker.c +++ b/dlls/ole32/filemoniker.c @@ -1011,19 +1011,27 @@ FileMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther,IMoniker** p int FileMonikerImpl_DecomposePath(LPCOLESTR str, LPOLESTR** stringTable) { static const WCHAR bSlash[] = {'\',0}; - WCHAR word[MAX_PATH]; - int i=0,j,tabIndex=0; + LPOLESTR word; + int i=0,j,tabIndex=0, ret=0; LPOLESTR *strgtable ;
int len=lstrlenW(str);
TRACE("%s, %p\n", debugstr_w(str), *stringTable);
- strgtable =CoTaskMemAlloc(len*sizeof(LPOLESTR)); + strgtable = CoTaskMemAlloc(len*sizeof(WCHAR));
if (strgtable==NULL) return E_OUTOFMEMORY;
+ word = CoTaskMemAlloc((len + 1)*sizeof(WCHAR)); + + if (word==NULL) + { + ret = E_OUTOFMEMORY; + goto lend; + } + while(str[i]!=0){
if(str[i]==bSlash[0]){ @@ -1031,7 +1039,10 @@ int FileMonikerImpl_DecomposePath(LPCOLESTR str, LPOLESTR** stringTable) strgtable[tabIndex]=CoTaskMemAlloc(2*sizeof(WCHAR));
if (strgtable[tabIndex]==NULL) - return E_OUTOFMEMORY; + { + ret = E_OUTOFMEMORY; + goto lend; + }
strcpyW(strgtable[tabIndex++],bSlash);
@@ -1048,7 +1059,10 @@ int FileMonikerImpl_DecomposePath(LPCOLESTR str, LPOLESTR** stringTable) strgtable[tabIndex]=CoTaskMemAlloc(sizeof(WCHAR)*(j+1));
if (strgtable[tabIndex]==NULL) - return E_OUTOFMEMORY; + { + ret = E_OUTOFMEMORY; + goto lend; + }
strcpyW(strgtable[tabIndex++],word); } @@ -1057,7 +1071,21 @@ int FileMonikerImpl_DecomposePath(LPCOLESTR str, LPOLESTR** stringTable)
*stringTable=strgtable;
- return tabIndex; + ret = tabIndex; + +lend: + if (ret < 0) + { + for (i = 0; i < tabIndex; i++) + CoTaskMemFree(strgtable[i]); + + CoTaskMemFree(strgtable); + } + + if (word) + CoTaskMemFree(word); + + return ret; }
/******************************************************************************