<<diff41.txt>>
Bill Medland (medbi01@accpac.com) Fixed GetDocumentation a little. When called from RegisterTypeLib it was leaving the Doc entry uninitialised, leading to page fault when measuring it. Also ensure correct freeing of resources on failure. I am not sure how correct the solution is; it works for my case though. Index: wine/dlls/oleaut32/typelib.c =================================================================== RCS file: /home/wine/wine/dlls/oleaut32/typelib.c,v retrieving revision 1.57 diff -u -r1.57 typelib.c --- wine/dlls/oleaut32/typelib.c 2001/11/19 02:30:03 1.57 +++ wine/dlls/oleaut32/typelib.c 2002/01/08 20:46:47 @@ -3186,6 +3186,8 @@ * and path, and the context identifier for the library Help topic in the Help * file. * + * On a successful return all non-null BSTR pointers will have been set, + * possibly to NULL. */ static HRESULT WINAPI ITypeLib2_fnGetDocumentation( ITypeLib2 *iface, @@ -3209,32 +3211,36 @@ if(index<0) { - /* documentation for the typelib */ - if(pBstrName && This->Name) - { - *pBstrName = SysAllocString(This->Name); - - if (!(*pBstrName)) return STG_E_INSUFFICIENTMEMORY; - } - if(pBstrDocString && This->DocString) - { - *pBstrDocString = SysAllocString(This->DocString); - - if (!(*pBstrDocString)) return STG_E_INSUFFICIENTMEMORY; - } - - if(pdwHelpContext) - { + /* documentation for the typelib */ + if(pBstrName) + { + if (This->Name) + if(!(*pBstrName = SysAllocString(This->Name))) goto memerr1;else; + else + *pBstrName = NULL; + } + if(pBstrDocString) + { + if (This->DocString) + if(!(*pBstrDocString = SysAllocString(This->DocString))) goto memerr2;else; + else if (This->Name) + if(!(*pBstrDocString = SysAllocString(This->Name))) goto memerr2;else; + else + *pBstrDocString = NULL; + } + if(pdwHelpContext) + { *pdwHelpContext = This->dwHelpContext; - } - if(pBstrHelpFile && This->HelpFile) - { - *pBstrHelpFile = SysAllocString(This->HelpFile); - - if (!(*pBstrHelpFile)) return STG_E_INSUFFICIENTMEMORY; - } + } + if(pBstrHelpFile) + { + if (This->HelpFile) + if(!(*pBstrHelpFile = SysAllocString(This->HelpFile))) goto memerr3;else; + else + *pBstrHelpFile = NULL; + } - result = S_OK; + result = S_OK; } else { @@ -3253,6 +3259,12 @@ } } return result; +memerr3: + if (pBstrDocString) SysFreeString (*pBstrDocString); +memerr2: + if (pBstrName) SysFreeString (*pBstrName); +memerr1: + return STG_E_INSUFFICIENTMEMORY; } /* ITypeLib::IsName