-
Notifications
You must be signed in to change notification settings - Fork 8k
Open
Description
Description
The following code:
<?php
$v = new variant("123");
$v2 = clone $v;Resulted in this output:
Assertion failed: (!(((uintptr_t)((executor_globals.objects_store).object_buckets[handle])) & (1<<0))), file Zend\zend_objects_API.c, line 189
But I expected no output instead.
php-src/ext/com_dotnet/php_com_dotnet_internal.h
Lines 28 to 49 in b14469b
| typedef struct _php_com_dotnet_object { | |
| zend_object zo; | |
| VARIANT v; | |
| bool modified; | |
| int code_page; | |
| ITypeInfo *typeinfo; | |
| zend_class_entry *ce; | |
| /* associated event sink */ | |
| IDispatch *sink_dispatch; | |
| GUID sink_id; | |
| DWORD sink_cookie; | |
| /* cache for method signatures */ | |
| HashTable *method_cache; | |
| /* cache for name -> DISPID */ | |
| HashTable *id_of_name_cache; | |
| } php_com_dotnet_object; |
php-src/ext/com_dotnet/com_handlers.c
Lines 594 to 616 in b14469b
| zend_object* php_com_object_clone(zend_object *object) | |
| { | |
| php_com_dotnet_object *cloneobj, *origobject; | |
| origobject = (php_com_dotnet_object*) object; | |
| cloneobj = (php_com_dotnet_object*)emalloc(sizeof(php_com_dotnet_object)); | |
| memcpy(cloneobj, origobject, sizeof(*cloneobj)); | |
| /* VariantCopy will perform VariantClear; we don't want to clobber | |
| * the IDispatch that we memcpy'd, so we init a new variant in the | |
| * clone structure */ | |
| VariantInit(&cloneobj->v); | |
| /* We use the Indirection-following version of the API since we | |
| * want to clone as much as possible */ | |
| VariantCopyInd(&cloneobj->v, &origobject->v); | |
| if (cloneobj->typeinfo) { | |
| ITypeInfo_AddRef(cloneobj->typeinfo); | |
| } | |
| return (zend_object*)cloneobj; | |
| } |
That memcpy() is a "bit" crude, and while we cater to v and typeinfo, we apparently missed sink_dispatch and possibly the elements of method_cache. modified seems to need an reset (not sure, though).
(I also wonder why we store the ce.)
Anyhow, I wonder if that's worth fixing, or whether we should just forbid cloning in the first place; we can still implement proper cloning if requested.
PHP Version
master (but likely since PHP 7, or even before)
Operating System
Windows