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