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