oleaut32: Added TypeInfo validation in ICreateTypeInfo_LayOut.

This commit is contained in:
Piotr Caban 2010-02-22 01:58:17 +01:00 committed by Alexandre Julliard
parent 1dda40deb2
commit 1765229158
1 changed files with 49 additions and 7 deletions

View File

@ -1978,7 +1978,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(
ICreateTypeInfo2* iface) ICreateTypeInfo2* iface)
{ {
ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface; ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface;
CyclicList *iter, *iter2; CyclicList *iter, *iter2, **typedata;
int i; int i;
TRACE("(%p)\n", iface); TRACE("(%p)\n", iface);
@ -1986,6 +1986,10 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(
if(!This->typedata) if(!This->typedata)
return S_OK; return S_OK;
typedata = HeapAlloc(GetProcessHeap(), 0, sizeof(CyclicList*)*This->typeinfo->cElement);
if(!typedata)
return E_OUTOFMEMORY;
/* Assign IDs and VTBL entries */ /* Assign IDs and VTBL entries */
i = 0; i = 0;
This->typeinfo->cbSizeVft = 0; This->typeinfo->cbSizeVft = 0;
@ -1993,6 +1997,8 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(
if(iter->indice == MEMBERID_NIL) if(iter->indice == MEMBERID_NIL)
FIXME("MEMBERID_NIL handling not yet implemented\n"); FIXME("MEMBERID_NIL handling not yet implemented\n");
typedata[i] = iter;
iter->u.data[0] = (iter->u.data[0]&0xffff) | (i<<16); iter->u.data[0] = (iter->u.data[0]&0xffff) | (i<<16);
if((This->typeinfo->typekind&0xf) != TKIND_MODULE) { if((This->typeinfo->typekind&0xf) != TKIND_MODULE) {
@ -2018,7 +2024,33 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut(
i++; i++;
} }
FIXME("Typeinfo validation not implemented\n"); for(i=0; i<This->typeinfo->cElement; i++) {
if(typedata[i]->u.data[4]>>16 > i) {
int inv;
inv = (typedata[i]->u.data[4]>>3) & 0xf;
i = typedata[i]->u.data[4] >> 16;
while(i > typedata[i]->u.data[4]>>16) {
int invkind = (typedata[i]->u.data[4]>>3) & 0xf;
if(inv & invkind) {
HeapFree(GetProcessHeap(), 0, typedata);
return TYPE_E_DUPLICATEID;
}
i = typedata[i]->u.data[4] >> 16;
inv |= invkind;
}
if(inv & INVOKE_FUNC) {
HeapFree(GetProcessHeap(), 0, typedata);
return TYPE_E_INCONSISTENTPROPFUNCS;
}
}
}
HeapFree(GetProcessHeap(), 0, typedata);
return S_OK; return S_OK;
} }
@ -3384,17 +3416,23 @@ static int ctl2_write_segment(ICreateTypeLib2Impl *This, HANDLE hFile, int segme
return -1; return -1;
} }
static void ctl2_finalize_typeinfos(ICreateTypeLib2Impl *This, int filesize) static HRESULT ctl2_finalize_typeinfos(ICreateTypeLib2Impl *This, int filesize)
{ {
ICreateTypeInfo2Impl *typeinfo; ICreateTypeInfo2Impl *typeinfo;
HRESULT hres;
for (typeinfo = This->typeinfos; typeinfo; typeinfo = typeinfo->next_typeinfo) { for (typeinfo = This->typeinfos; typeinfo; typeinfo = typeinfo->next_typeinfo) {
typeinfo->typeinfo->memoffset = filesize; typeinfo->typeinfo->memoffset = filesize;
if (typeinfo->typedata) { if (typeinfo->typedata) {
ICreateTypeInfo2_fnLayOut((ICreateTypeInfo2 *)typeinfo); hres = ICreateTypeInfo2_fnLayOut((ICreateTypeInfo2 *)typeinfo);
if(FAILED(hres))
return hres;
filesize += typeinfo->typedata->next->u.val + ((typeinfo->typeinfo->cElement >> 16) * 12) + ((typeinfo->typeinfo->cElement & 0xffff) * 12) + 4; filesize += typeinfo->typedata->next->u.val + ((typeinfo->typeinfo->cElement >> 16) * 12) + ((typeinfo->typeinfo->cElement & 0xffff) * 12) + 4;
} }
} }
return S_OK;
} }
static int ctl2_finalize_segment(ICreateTypeLib2Impl *This, int filepos, int segment) static int ctl2_finalize_segment(ICreateTypeLib2Impl *This, int filepos, int segment)
@ -3448,6 +3486,7 @@ static HRESULT WINAPI ICreateTypeLib2_fnSaveAllChanges(ICreateTypeLib2 * iface)
int retval; int retval;
int filepos; int filepos;
HANDLE hFile; HANDLE hFile;
HRESULT hres;
TRACE("(%p)\n", iface); TRACE("(%p)\n", iface);
@ -3473,7 +3512,11 @@ static HRESULT WINAPI ICreateTypeLib2_fnSaveAllChanges(ICreateTypeLib2 * iface)
filepos += ctl2_finalize_segment(This, filepos, MSFT_SEG_CUSTDATA); filepos += ctl2_finalize_segment(This, filepos, MSFT_SEG_CUSTDATA);
filepos += ctl2_finalize_segment(This, filepos, MSFT_SEG_CUSTDATAGUID); filepos += ctl2_finalize_segment(This, filepos, MSFT_SEG_CUSTDATAGUID);
ctl2_finalize_typeinfos(This, filepos); hres = ctl2_finalize_typeinfos(This, filepos);
if(FAILED(hres)) {
CloseHandle(hFile);
return hres;
}
if (!ctl2_write_chunk(hFile, &This->typelib_header, sizeof(This->typelib_header))) return retval; if (!ctl2_write_chunk(hFile, &This->typelib_header, sizeof(This->typelib_header))) return retval;
if (This->typelib_header.varflags & HELPDLLFLAG) if (This->typelib_header.varflags & HELPDLLFLAG)
@ -3498,8 +3541,7 @@ static HRESULT WINAPI ICreateTypeLib2_fnSaveAllChanges(ICreateTypeLib2 * iface)
if (!CloseHandle(hFile)) return retval; if (!CloseHandle(hFile)) return retval;
retval = S_OK; return S_OK;
return retval;
} }