PATCH: 01-typelib.diff

Marcus Meissner marcus at jet.franken.de
Sun Feb 3 14:32:10 CST 2002


On Sun, Feb 03, 2002 at 09:25:11PM +0100, Marcus Meissner wrote:
> Hi,
> 
> Malte Starostik submitted this patch to wine-patches on
> "Sat Oct 13 2001 - 08:11:00 EDT".
> 
> While not 100% correct, it fixes a very unfunny problem with a typelib
> using program I have, so please apply. :)
> 
> His mail (http://www.winehq.com/hypermail/wine-patches/2001/10/0086.html)
> > This makes sure the ITypeLib held by ITypeInfo isn't destroyed before
> > the type info is, as happened in reaktivate. There, the IProvideClassInfo
> > interface of the loaded control would load the type lib, release it and
> > then the returned ITypeInfo referenced this freed typelib.
> > 
> > However, now the type lib isn't freed at all, which seems to me to be caused 
> > by ITypeInfoImpl's reflist never being freed, and therefore the ITypeLibs 
> > referenced there are not released. I don't grok enough of this code to check 
> > where that should be done properly though :(
> 
> Ciao, Marcus
> 

And actually I should migrate the compile errors back into the patch before
submitting.

Ciao, Marcus
Changelog:
	Malte Starostik <malte at kde.org>
	Do not destroy ITypeLib held by ITypeInfo before the latter is
	freed.

Index: typelib.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/typelib.c,v
retrieving revision 1.61
diff -u -r1.61 typelib.c
--- typelib.c	2002/01/29 17:05:11	1.61
+++ typelib.c	2002/02/03 18:38:45
@@ -1739,6 +1744,7 @@
         pcx->pTblDir->pTypeInfoTab.offset+count*sizeof(tiBase));
 /* this is where we are coming from */
     ptiRet->pTypeLib = pLibInfo;
+    ITypeLib2_AddRef((ITypeLib2 *)pLibInfo);
     ptiRet->index=count;
 /* fill in the typeattr fields */
     FIXME("Assign constructor/destructor memid\n");
@@ -2883,6 +2888,7 @@
       }
       *ppTypeInfoImpl = (ITypeInfoImpl*)ITypeInfo_Constructor();
       (*ppTypeInfoImpl)->pTypeLib = pTypeLibImpl;
+	  ITypeLib2_AddRef((ITypeLib2 *)pTypeLibImpl);
       (*ppTypeInfoImpl)->index = i;
       (*ppTypeInfoImpl)->Name = TLB_MultiByteToBSTR(
 					     pOtherTypeInfoBlks[i].name_offs +
@@ -4217,7 +4257,7 @@
 	if(!pRefType)
 	  FIXME("Can't find pRefType for ref %lx\n", hRefType);
 	if(pRefType && hRefType != -1) {
-            ITypeLib *pTLib;
+            ITypeLib *pTLib = NULL;
 
 	    if(pRefType->pImpTLInfo == TLB_REF_INTERNAL) {
 	        int Index;
@@ -4256,6 +4296,8 @@
 		    result = ITypeLib2_GetTypeInfo(pTLib, pRefType->index,
 						   ppTInfo);
 	    }
+	    if (pTLib != NULL)
+		ITypeLib2_Release(pTLib);
 	}
     }
 




More information about the wine-patches mailing list