wez Tue Jul 8 05:10:42 2003 EDT Modified files: (Branch: PHP_4_3) /php-src/ext/com COM.c Log: Fix leak when loading constants from a type-library. Index: php-src/ext/com/COM.c diff -u php-src/ext/com/COM.c:1.90.2.7 php-src/ext/com/COM.c:1.90.2.8 --- php-src/ext/com/COM.c:1.90.2.7 Fri May 16 15:20:18 2003 +++ php-src/ext/com/COM.c Tue Jul 8 05:10:42 2003 @@ -18,7 +18,7 @@ | Wez Furlong <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: COM.c,v 1.90.2.7 2003/05/16 19:20:18 wez Exp $ */ +/* $Id: COM.c,v 1.90.2.8 2003/07/08 09:10:42 wez Exp $ */ /* * This module implements support for COM components that support the IDispatch * interface. Both local (COM) and remote (DCOM) components can be accessed. @@ -55,7 +55,7 @@ #ifdef PHP_WIN32 #define _WIN32_DCOM - +#define COBJMACROS #include <iostream.h> #include <math.h> #include <ocidl.h> @@ -2224,7 +2224,6 @@ PHPAPI int php_COM_load_typelib(ITypeLib *TypeLib, int mode TSRMLS_DC) { - ITypeComp *TypeComp; int i; int interfaces; @@ -2232,40 +2231,33 @@ return FAILURE; } - interfaces = TypeLib->lpVtbl->GetTypeInfoCount(TypeLib); + interfaces = ITypeLib_GetTypeInfoCount(TypeLib); - TypeLib->lpVtbl->GetTypeComp(TypeLib, &TypeComp); for (i=0; i<interfaces; i++) { TYPEKIND pTKind; - TypeLib->lpVtbl->GetTypeInfoType(TypeLib, i, &pTKind); - if (pTKind==TKIND_ENUM) { + ITypeLib_GetTypeInfoType(TypeLib, i, &pTKind); + if (pTKind == TKIND_ENUM) { ITypeInfo *TypeInfo; VARDESC *pVarDesc; UINT NameCount; int j; -#if 0 - BSTR bstr_EnumId; - char *EnumId; - - TypeLib->lpVtbl->GetDocumentation(TypeLib, i, &bstr_EnumId, NULL, NULL, NULL); - EnumId = php_OLECHAR_to_char(bstr_EnumId, NULL, codepage); - printf("Enumeration %d - %s:\n", i, EnumId); - efree(EnumId); -#endif - TypeLib->lpVtbl->GetTypeInfo(TypeLib, i, &TypeInfo); + ITypeLib_GetTypeInfo(TypeLib, i, &TypeInfo); - j=0; - while (SUCCEEDED(TypeInfo->lpVtbl->GetVarDesc(TypeInfo, j, &pVarDesc))) { + for (j = 0; ; j++) { BSTR bstr_ids; zend_constant c; zval exists, results, value; char *const_name; - TypeInfo->lpVtbl->GetNames(TypeInfo, pVarDesc->memid, &bstr_ids, 1, &NameCount); - if (NameCount!=1) { - j++; + if (FAILED(ITypeInfo_GetVarDesc(TypeInfo, j, &pVarDesc))) { + break; + } + + ITypeInfo_GetNames(TypeInfo, pVarDesc->memid, &bstr_ids, 1, &NameCount); + if (NameCount != 1) { + ITypeInfo_ReleaseVarDesc(TypeInfo, pVarDesc); continue; } const_name = php_OLECHAR_to_char(bstr_ids, &c.name_len, codepage TSRMLS_CC); @@ -2282,7 +2274,7 @@ php_error(E_WARNING, "%s(): Type library value %s is already defined and has a different value", get_active_function_name(TSRMLS_C), c.name); } free(c.name); - j++; + ITypeInfo_ReleaseVarDesc(TypeInfo, pVarDesc); continue; } @@ -2296,10 +2288,9 @@ zend_register_constant(&c TSRMLS_CC); } - - j++; + ITypeInfo_ReleaseVarDesc(TypeInfo, pVarDesc); } - TypeInfo->lpVtbl->Release(TypeInfo); + ITypeInfo_Release(TypeInfo); } }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php