From de738496c2c323b580d9aff0f121876e4101a910 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Fri, 15 Feb 2019 00:35:21 +0100 Subject: [PATCH] Fix #77621: Already defined constants are not properly reported We must not check uninitialized values (i.e. `c.value`), and we have to use proper types for printf-style formats (i.e. `char *` instead of `zend_string *`). --- NEWS | 4 ++++ ext/com_dotnet/com_typeinfo.c | 6 +++--- ext/com_dotnet/tests/bug77621.phpt | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 ext/com_dotnet/tests/bug77621.phpt diff --git a/NEWS b/NEWS index a4dd406354..2f6d4ef952 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,10 @@ PHP NEWS . Fixed bug #77589 (Core dump using parse_ini_string with numeric sections). (Laruence) +- COM: + . Fixed bug #77621 (Already defined constants are not properly reported). + (cmb) + - PDO_OCI: . Support Oracle Database tracing attributes ACTION, MODULE, CLIENT_INFO, and CLIENT_IDENTIFIER. (Cameron Porter) diff --git a/ext/com_dotnet/com_typeinfo.c b/ext/com_dotnet/com_typeinfo.c index a0fa3c0749..40f21aea6b 100644 --- a/ext/com_dotnet/com_typeinfo.c +++ b/ext/com_dotnet/com_typeinfo.c @@ -197,9 +197,10 @@ PHP_COM_DOTNET_API int php_com_import_typelib(ITypeLib *TL, int mode, int codepa SysFreeString(bstr_ids); /* sanity check for the case where the constant is already defined */ + php_com_zval_from_variant(&value, pVarDesc->lpvarValue, codepage); if ((exists = zend_get_constant(c.name)) != NULL) { - if (COMG(autoreg_verbose) && !compare_function(&results, &c.value, exists)) { - php_error_docref(NULL, E_WARNING, "Type library constant %s is already defined", c.name); + if (COMG(autoreg_verbose) && !compare_function(&results, &value, exists)) { + php_error_docref(NULL, E_WARNING, "Type library constant %s is already defined", ZSTR_VAL(c.name)); } zend_string_release(c.name); ITypeInfo_ReleaseVarDesc(TypeInfo, pVarDesc); @@ -207,7 +208,6 @@ PHP_COM_DOTNET_API int php_com_import_typelib(ITypeLib *TL, int mode, int codepa } /* register the constant */ - php_com_zval_from_variant(&value, pVarDesc->lpvarValue, codepage); if (Z_TYPE(value) == IS_LONG) { c.flags = mode; ZVAL_LONG(&c.value, Z_LVAL(value)); diff --git a/ext/com_dotnet/tests/bug77621.phpt b/ext/com_dotnet/tests/bug77621.phpt new file mode 100644 index 0000000000..5c24494637 --- /dev/null +++ b/ext/com_dotnet/tests/bug77621.phpt @@ -0,0 +1,18 @@ +--TEST-- +Bug #77621 (Already defined constants are not properly reported) +--SKIPIF-- + +--INI-- +com.autoregister_verbose=1 +--FILE-- + +===DONE=== +--EXPECTF-- +Warning: com_load_typelib(): Type library constant ADSTYPE_INVALID is already defined in %s on line %d +===DONE=== -- 2.40.0