]> granicus.if.org Git - php/commitdiff
Fix #77621: Already defined constants are not properly reported
authorChristoph M. Becker <cmbecker69@gmx.de>
Thu, 14 Feb 2019 23:35:21 +0000 (00:35 +0100)
committerChristoph M. Becker <cmbecker69@gmx.de>
Thu, 14 Feb 2019 23:35:21 +0000 (00:35 +0100)
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
ext/com_dotnet/com_typeinfo.c
ext/com_dotnet/tests/bug77621.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index a4dd4063542bb604ad7b5dc55bd7eb5794a5d769..2f6d4ef952139d574d7d4385e3652f98ff1abf45 100644 (file)
--- 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)
index a0fa3c07491135c66d9a12993477dfc237efd9cd..40f21aea6bda83bbbfab6ed7f7f3063fc8e53e38 100644 (file)
@@ -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 (file)
index 0000000..5c24494
--- /dev/null
@@ -0,0 +1,18 @@
+--TEST--
+Bug #77621 (Already defined constants are not properly reported)
+--SKIPIF--
+<?php
+if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
+?>
+--INI--
+com.autoregister_verbose=1
+--FILE--
+<?php
+define('ADSTYPE_INVALID', 0);
+$root = dirname(array_change_key_case($_SERVER, CASE_UPPER)['COMSPEC']);
+com_load_typelib("$root\activeds.tlb");
+?>
+===DONE===
+--EXPECTF--
+Warning: com_load_typelib(): Type library constant ADSTYPE_INVALID is already defined in %s on line %d
+===DONE===