- Avoid null-pointer exceptions by testing listnodes validity before doing

any work with those.
- TLB_ReadTypeLib now retrieves the length of the TLB and passes it to
  the TLB constructor which initializes TLBContext::length to that
  value.
- For non-standard pointed types, td[3] is always 0. I observed that
  the type is stored at td[2]/8 and not td[3]/8.
- Null-pointer exception occurs when GetRefTypeOfImplType is called on a
  type with no inherited interfaces. If the implemented types linked list
  is empty, set pRefType as 0 and return S_OK.
This commit is contained in:
James Hatheway 2000-08-09 22:24:04 +00:00 committed by Alexandre Julliard
parent 8b5b0076a1
commit 044d251980
1 changed files with 22 additions and 10 deletions

View File

@ -355,7 +355,7 @@ typedef struct tagITypeLibImpl
static struct ICOM_VTABLE(ITypeLib2) tlbvt;
/* ITypeLib methods */
static ITypeLib2* ITypeLib2_Constructor(LPVOID pLib);
static ITypeLib2* ITypeLib2_Constructor(LPVOID pLib, DWORD dwTLBLength);
/*======================= ITypeInfo implementation =======================*/
@ -1107,7 +1107,10 @@ int TLB_ReadTypeLib(LPSTR pszFileName, ITypeLib2 **ppTypeLib)
dwSignature = *((DWORD*) pBase);
if ( dwSignature == MSFT_SIGNATURE)
{
*ppTypeLib = ITypeLib2_Constructor(pBase);
/* retrieve file size */
DWORD dwTLBLength = GetFileSize(hFile, NULL);
*ppTypeLib = ITypeLib2_Constructor(pBase, dwTLBLength);
}
UnmapViewOfFile(pBase);
}
@ -1130,12 +1133,14 @@ int TLB_ReadTypeLib(LPSTR pszFileName, ITypeLib2 **ppTypeLib)
if (hGlobal)
{
LPVOID pBase = LockResource(hGlobal);
DWORD dwTLBLength = SizeofResource(hinstDLL, hrsrc);
if (pBase)
{
/* try to load as incore resource */
dwSignature = *((DWORD*) pBase);
if ( dwSignature == MSFT_SIGNATURE)
*ppTypeLib = ITypeLib2_Constructor(pBase);
*ppTypeLib = ITypeLib2_Constructor(pBase, dwTLBLength);
else
FIXME("Header type magic 0x%08lx not supported.\n",dwSignature);
}
@ -1161,7 +1166,7 @@ int TLB_ReadTypeLib(LPSTR pszFileName, ITypeLib2 **ppTypeLib)
*
* loading a typelib from a in-memory image
*/
static ITypeLib2* ITypeLib2_Constructor(LPVOID pLib)
static ITypeLib2* ITypeLib2_Constructor(LPVOID pLib, DWORD dwTLBLength)
{
TLBContext cx;
long lPSegDir;
@ -1169,7 +1174,7 @@ static ITypeLib2* ITypeLib2_Constructor(LPVOID pLib)
TLBSegDir tlbSegDir;
ITypeLibImpl * pTypeLibImpl;
TRACE("%p\n", pLib);
TRACE("%p, TLB length = %ld\n", pLib, dwTLBLength);
pTypeLibImpl = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(ITypeLibImpl));
if (!pTypeLibImpl) return NULL;
@ -1182,7 +1187,8 @@ static ITypeLib2* ITypeLib2_Constructor(LPVOID pLib)
cx.oStart=0;
cx.mapping = pLib;
cx.pLibInfo = pTypeLibImpl;
cx.length = dwTLBLength;
/* read header */
TLB_Read((void*)&tlbHeader, sizeof(tlbHeader), &cx, 0);
TRACE("header:\n");
@ -1257,7 +1263,7 @@ static ITypeLib2* ITypeLib2_Constructor(LPVOID pLib)
if(td[3] < 0)
V_UNION(&(pTypeLibImpl->pTypeDesc[i]),lptdesc)= & stndTypeDesc[td[2]];
else
V_UNION(&(pTypeLibImpl->pTypeDesc[i]),lptdesc)= & pTypeLibImpl->pTypeDesc[td[3]/8];
V_UNION(&(pTypeLibImpl->pTypeDesc[i]),lptdesc)= & pTypeLibImpl->pTypeDesc[td[2]/8];
}
else if(td[0] == VT_CARRAY)
{
@ -2013,7 +2019,7 @@ static HRESULT WINAPI ITypeInfo_fnGetNames( ITypeInfo2 *iface, MEMBERID memid,
TLBVarDesc * pVDesc;
int i;
TRACE("(%p) memid=0x%08lx Maxname=%d\n", This, memid, cMaxNames);
for(pFDesc=This->funclist; pFDesc->funcdesc.memid != memid && pFDesc; pFDesc=pFDesc->next);
for(pFDesc=This->funclist; pFDesc && pFDesc->funcdesc.memid != memid; pFDesc=pFDesc->next);
if(pFDesc)
{
/* function found, now return function and parameter names */
@ -2028,10 +2034,10 @@ static HRESULT WINAPI ITypeInfo_fnGetNames( ITypeInfo2 *iface, MEMBERID memid,
}
else
{
for(pVDesc=This->varlist; pVDesc->vardesc.memid != memid && pVDesc; pVDesc=pVDesc->next);
for(pVDesc=This->varlist; pVDesc && pVDesc->vardesc.memid != memid; pVDesc=pVDesc->next);
if(pVDesc)
{
*rgBstrNames=TLB_DupAtoBstr(pFDesc->Name);
*rgBstrNames=TLB_DupAtoBstr(pVDesc->Name);
*pcNames=1;
}
else
@ -2081,6 +2087,12 @@ static HRESULT WINAPI ITypeInfo_fnGetRefTypeOfImplType(
TRACE("(%p) index %d\n", This, index);
dump_TypeInfo(This);
if (!pIref)
{
*pRefType = 0;
return S_OK;
}
if(index==(UINT)-1)
{