]> granicus.if.org Git - php/commitdiff
Fix #79242: COM error constants don't match com_exception codes
authorChristoph M. Becker <cmbecker69@gmx.de>
Fri, 7 Feb 2020 17:04:14 +0000 (18:04 +0100)
committerChristoph M. Becker <cmbecker69@gmx.de>
Fri, 7 Feb 2020 17:04:14 +0000 (18:04 +0100)
Because a `HRESULT` is a `LONG`[1], no special treatment is required on
x86 platforms to get appropriate values.  On x64 platforms we prefer
positive values, what we could accomplish by casting the `HRESULT`
value to `ULONG` and then to `zend_long`, but since the current
behavior is correct and the performance improvement is negligible, we
defer that to master.

[1] <https://docs.microsoft.com/en-us/windows/win32/winprog/windows-data-types#hresult>

NEWS
ext/com_dotnet/com_extension.c
ext/com_dotnet/tests/bug79242.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 2c810370ebaf02a9a27f144cfa8245089eba2677..86a6be63b4c789796dc40130b4211b5ef408f43b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,8 @@ PHP                                                                        NEWS
 - COM:
   . Fixed bug #66322 (COMPersistHelper::SaveToFile can save to wrong location).
     (cmb)
+  . Fixed bug #79242 (COM error constants don't match com_exception codes on
+    x86). (cmb)
 
 - PCRE:
   . Fixed bug #79188 (Memory corruption in preg_replace/preg_replace_callback
index a9fd0e7fde66cb09c9e01458f1a277364a0cbb9f..025f6803df15dccbcdcea4e856c30c3a868fa8bb 100644 (file)
@@ -336,11 +336,15 @@ PHP_MINIT_FUNCTION(com_dotnet)
 
 #define COM_CONST(x) REGISTER_LONG_CONSTANT(#x, x, CONST_CS|CONST_PERSISTENT)
 
-#define COM_ERR_CONST(x) { \
+#if SIZEOF_ZEND_LONG == 8
+# define COM_ERR_CONST(x) { \
        zend_long __tmp; \
        ULongToIntPtr(x, &__tmp); \
        REGISTER_LONG_CONSTANT(#x, __tmp, CONST_CS|CONST_PERSISTENT); \
 }
+#else
+# define COM_ERR_CONST COM_CONST
+#endif
 
        COM_CONST(CLSCTX_INPROC_SERVER);
        COM_CONST(CLSCTX_INPROC_HANDLER);
diff --git a/ext/com_dotnet/tests/bug79242.phpt b/ext/com_dotnet/tests/bug79242.phpt
new file mode 100644 (file)
index 0000000..46c5d8a
--- /dev/null
@@ -0,0 +1,22 @@
+--TEST--
+Bug #79242 (COM error constants don't match com_exception codes)
+--SKIPIF--
+<?php
+if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
+if (PHP_INT_SIZE != 4) die("skip this test is for 32bit platforms only");
+?>
+--FILE--
+<?php
+var_dump(
+    DISP_E_DIVBYZERO,
+    DISP_E_OVERFLOW,
+    DISP_E_BADINDEX,
+    MK_E_UNAVAILABLE
+);
+?>
+--EXPECT--
+int(-2147352558)
+int(-2147352566)
+int(-2147352565)
+int(-2147221021)
+