oleaut32: Added TypeInfo validation in ICreateTypeInfo_LayOut.
This commit is contained in:
parent
1dda40deb2
commit
1765229158
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue