]> granicus.if.org Git - php/commitdiff
Fix #78650: new COM Crash
authorChristoph M. Becker <cmbecker69@gmx.de>
Wed, 9 Oct 2019 12:03:36 +0000 (14:03 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Wed, 9 Oct 2019 12:09:02 +0000 (14:09 +0200)
As of PHP 7.4.0, the `get_property_ptr_ptr` handler is mandatory; we
implement it to always return `NULL`, which is equivalent to not
setting the handler in former versions.

We add a portable and faster test case than what has been presented in
the bug ticket.

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

diff --git a/NEWS b/NEWS
index ff37a024b123dfe1b67df2e702b13dd8ecfffa09..2a54015954df5e1e29f56f4cb26da2e868ab5a52 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,9 @@ PHP                                                                        NEWS
   . Fixed bug #78644 (SEGFAULT in ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDLER).
     (Nikita)
 
+- COM:
+  . Fixed bug #78650 (new COM Crash). (cmb)
+
 - Iconv:
   . Fixed bug #78642 (Wrong libiconv version displayed). (gedas at martynas,
     cmb).
index 0a4693fec5ff2ff215fa4f723b952e570cf048cc..8a70e60d764b426dab4ee03dabad882b0129e002 100644 (file)
@@ -174,6 +174,11 @@ static void com_write_dimension(zval *object, zval *offset, zval *value)
        }
 }
 
+static zval *com_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot)
+{
+       return NULL;
+}
+
 #if 0
 static void com_object_set(zval **property, zval *value)
 {
@@ -546,7 +551,7 @@ zend_object_handlers php_com_object_handlers = {
        com_property_write,
        com_read_dimension,
        com_write_dimension,
-       NULL,
+       com_get_property_ptr_ptr,
        NULL, /* com_object_get, */
        NULL, /* com_object_set, */
        com_property_exists,
diff --git a/ext/com_dotnet/tests/bug78650.phpt b/ext/com_dotnet/tests/bug78650.phpt
new file mode 100644 (file)
index 0000000..c362de9
--- /dev/null
@@ -0,0 +1,27 @@
+--TEST--
+Bug #78650 (new COM Crash)
+--SKIPIF--
+<?php
+if (!extension_loaded('com_dotnet')) die('skip com_dotnet extension not available');
+?>
+--FILE--
+<?php
+$fname = __DIR__ . '/bug78650/foo/bar';
+mkdir($fname, 0777, true);
+
+$fso = new COM("Scripting.FileSystemObject");
+$folder = $fso->GetFolder($fname);
+$folder->ParentFolder->Name = 'baz';
+
+print('OK');
+?>
+--EXPECT--
+OK
+--CLEAN--
+<?php
+rmdir(__DIR__ . '/bug78650/baz/bar');
+rmdir(__DIR__ . '/bug78650/foo/bar');
+rmdir(__DIR__ . '/bug78650/baz');
+rmdir(__DIR__ . '/bug78650/foo');
+rmdir(__DIR__ . '/bug78650');
+?>