Andrew Eikum : oleaut32: Ensure that CyclicList nodes have a type.
Alexandre Julliard
julliard at winehq.org
Thu Aug 19 11:44:02 CDT 2010
Module: wine
Branch: master
Commit: 9c53c8e7b38db657232dfac728fc5b8504571db8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9c53c8e7b38db657232dfac728fc5b8504571db8
Author: Andrew Eikum <aeikum at codeweavers.com>
Date: Wed Aug 18 12:21:37 2010 -0500
oleaut32: Ensure that CyclicList nodes have a type.
Some code checks against the type of a CyclicList node, so we should
make sure that it's always initialized.
---
dlls/oleaut32/typelib2.c | 27 ++++++++++++++++-----------
1 files changed, 16 insertions(+), 11 deletions(-)
diff --git a/dlls/oleaut32/typelib2.c b/dlls/oleaut32/typelib2.c
index cc8c7a2..8009a68 100644
--- a/dlls/oleaut32/typelib2.c
+++ b/dlls/oleaut32/typelib2.c
@@ -118,15 +118,16 @@ WINE_DEFAULT_DEBUG_CHANNEL(typelib2);
/*================== Implementation Structures ===================================*/
/* Used for storing cyclic list. Tail address is kept */
-enum tagCyclicListElementType {
+typedef enum tagCyclicListElementType {
+ CyclicListSentinel,
CyclicListFunc,
CyclicListVar
-};
+} CyclicListElementType;
typedef struct tagCyclicList {
struct tagCyclicList *next;
int indice;
int name;
- enum tagCyclicListElementType type;
+ CyclicListElementType type;
union {
int val;
@@ -218,6 +219,14 @@ static inline ICreateTypeInfo2Impl *impl_from_ITypeInfo2( ITypeInfo2 *iface )
static ULONG WINAPI ICreateTypeLib2_fnRelease(ICreateTypeLib2 *iface);
+static CyclicList *alloc_cyclic_list_item(CyclicListElementType type)
+{
+ CyclicList *ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CyclicList));
+ if (!ret)
+ return NULL;
+ ret->type = type;
+ return ret;
+}
/*================== Internal functions ===================================*/
@@ -1793,19 +1802,18 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc(
}
if (!This->typedata) {
- This->typedata = HeapAlloc(GetProcessHeap(), 0, sizeof(CyclicList));
+ This->typedata = alloc_cyclic_list_item(CyclicListSentinel);
if(!This->typedata)
return E_OUTOFMEMORY;
This->typedata->next = This->typedata;
- This->typedata->u.val = 0;
if(This->dual)
This->dual->typedata = This->typedata;
}
/* allocate type data space for us */
- insert = HeapAlloc(GetProcessHeap(), 0, sizeof(CyclicList));
+ insert = alloc_cyclic_list_item(CyclicListFunc);
if(!insert)
return E_OUTOFMEMORY;
insert->u.data = HeapAlloc(GetProcessHeap(), 0, sizeof(int[6])+sizeof(int[(num_defaults?4:3)])*pFuncDesc->cParams);
@@ -1861,7 +1869,6 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc(
/* update the index data */
insert->indice = pFuncDesc->memid;
insert->name = -1;
- insert->type = CyclicListFunc;
/* insert type data to list */
if(index == This->typeinfo->cElement) {
@@ -2076,19 +2083,18 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(
}
if (!This->typedata) {
- This->typedata = HeapAlloc(GetProcessHeap(), 0, sizeof(CyclicList));
+ This->typedata = alloc_cyclic_list_item(CyclicListSentinel);
if(!This->typedata)
return E_OUTOFMEMORY;
This->typedata->next = This->typedata;
- This->typedata->u.val = 0;
if(This->dual)
This->dual->typedata = This->typedata;
}
/* allocate type data space for us */
- insert = HeapAlloc(GetProcessHeap(), 0, sizeof(CyclicList));
+ insert = alloc_cyclic_list_item(CyclicListVar);
if(!insert)
return E_OUTOFMEMORY;
insert->u.data = HeapAlloc(GetProcessHeap(), 0, sizeof(int[5]));
@@ -2115,7 +2121,6 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddVarDesc(
/* update the index data */
insert->indice = 0x40000000 + index;
insert->name = -1;
- insert->type = CyclicListVar;
/* figure out type widths and whatnot */
ctl2_encode_typedesc(This->typelib, &pVarDesc->elemdescVar.tdesc,
More information about the wine-cvs
mailing list