mirror of
https://github.com/php/php-src.git
synced 2025-08-18 15:08:55 +02:00
Fixed bug #35316 (Application exception trying to create COM object)
Fix some handler signatures causing memory corruption Various unicode fixes
This commit is contained in:
parent
1bec704ea7
commit
93ee6cd533
5 changed files with 16 additions and 13 deletions
|
@ -486,7 +486,7 @@ static int com_objects_compare(zval *object1, zval *object2 TSRMLS_DC)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int com_object_cast(zval *readobj, zval *writeobj, int type, int should_free TSRMLS_DC)
|
static int com_object_cast(zval *readobj, zval *writeobj, int type TSRMLS_DC)
|
||||||
{
|
{
|
||||||
php_com_dotnet_object *obj;
|
php_com_dotnet_object *obj;
|
||||||
VARIANT v;
|
VARIANT v;
|
||||||
|
@ -494,10 +494,6 @@ static int com_object_cast(zval *readobj, zval *writeobj, int type, int should_f
|
||||||
zval free_obj;
|
zval free_obj;
|
||||||
HRESULT res = S_OK;
|
HRESULT res = S_OK;
|
||||||
|
|
||||||
if (should_free) {
|
|
||||||
free_obj = *writeobj;
|
|
||||||
}
|
|
||||||
|
|
||||||
obj = CDNO_FETCH(readobj);
|
obj = CDNO_FETCH(readobj);
|
||||||
ZVAL_NULL(writeobj);
|
ZVAL_NULL(writeobj);
|
||||||
VariantInit(&v);
|
VariantInit(&v);
|
||||||
|
@ -539,10 +535,6 @@ static int com_object_cast(zval *readobj, zval *writeobj, int type, int should_f
|
||||||
|
|
||||||
VariantClear(&v);
|
VariantClear(&v);
|
||||||
|
|
||||||
if (should_free) {
|
|
||||||
zval_dtor(&free_obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SUCCEEDED(res)) {
|
if (SUCCEEDED(res)) {
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -678,6 +670,7 @@ zend_object_value php_com_object_new(zend_class_entry *ce TSRMLS_DC)
|
||||||
VariantInit(&obj->v);
|
VariantInit(&obj->v);
|
||||||
obj->code_page = CP_ACP;
|
obj->code_page = CP_ACP;
|
||||||
obj->ce = ce;
|
obj->ce = ce;
|
||||||
|
obj->zo.ce = ce;
|
||||||
|
|
||||||
retval.handle = zend_objects_store_put(obj, NULL, php_com_object_free_storage, php_com_object_clone TSRMLS_CC);
|
retval.handle = zend_objects_store_put(obj, NULL, php_com_object_free_storage, php_com_object_clone TSRMLS_CC);
|
||||||
retval.handlers = &php_com_object_handlers;
|
retval.handlers = &php_com_object_handlers;
|
||||||
|
|
|
@ -36,7 +36,7 @@ void php_com_throw_exception(HRESULT code, char *message TSRMLS_DC)
|
||||||
message = php_win_err(code);
|
message = php_win_err(code);
|
||||||
free_msg = 1;
|
free_msg = 1;
|
||||||
}
|
}
|
||||||
zend_throw_exception(php_com_exception_class_entry, message, (long)code TSRMLS_CC);
|
zend_throw_exception(U_CLASS_ENTRY(php_com_exception_class_entry), message, (long)code TSRMLS_CC);
|
||||||
if (free_msg) {
|
if (free_msg) {
|
||||||
LocalFree(message);
|
LocalFree(message);
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,7 @@ PHPAPI void php_com_wrap_dispatch(zval *z, IDispatch *disp,
|
||||||
memset(obj, 0, sizeof(*obj));
|
memset(obj, 0, sizeof(*obj));
|
||||||
obj->code_page = codepage;
|
obj->code_page = codepage;
|
||||||
obj->ce = php_com_variant_class_entry;
|
obj->ce = php_com_variant_class_entry;
|
||||||
|
obj->zo.ce = php_com_variant_class_entry;
|
||||||
|
|
||||||
VariantInit(&obj->v);
|
VariantInit(&obj->v);
|
||||||
V_VT(&obj->v) = VT_DISPATCH;
|
V_VT(&obj->v) = VT_DISPATCH;
|
||||||
|
@ -73,6 +74,7 @@ PHPAPI void php_com_wrap_variant(zval *z, VARIANT *v,
|
||||||
memset(obj, 0, sizeof(*obj));
|
memset(obj, 0, sizeof(*obj));
|
||||||
obj->code_page = codepage;
|
obj->code_page = codepage;
|
||||||
obj->ce = php_com_variant_class_entry;
|
obj->ce = php_com_variant_class_entry;
|
||||||
|
obj->zo.ce = php_com_variant_class_entry;
|
||||||
|
|
||||||
VariantInit(&obj->v);
|
VariantInit(&obj->v);
|
||||||
VariantCopyInd(&obj->v, v);
|
VariantCopyInd(&obj->v, v);
|
||||||
|
|
|
@ -323,7 +323,7 @@ static HashTable *saproxy_properties_get(zval *object TSRMLS_DC)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static union _zend_function *saproxy_method_get(zval *object, char *name, int len TSRMLS_DC)
|
static union _zend_function *saproxy_method_get(zval **object, char *name, int len TSRMLS_DC)
|
||||||
{
|
{
|
||||||
/* no methods */
|
/* no methods */
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -357,7 +357,7 @@ static int saproxy_objects_compare(zval *object1, zval *object2 TSRMLS_DC)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int saproxy_object_cast(zval *readobj, zval *writeobj, int type, int should_free TSRMLS_DC)
|
static int saproxy_object_cast(zval *readobj, zval *writeobj, int type TSRMLS_DC)
|
||||||
{
|
{
|
||||||
return FAILURE;
|
return FAILURE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -217,7 +217,13 @@ PHPAPI int php_com_zval_from_variant(zval *z, VARIANT *v, int codepage TSRMLS_DC
|
||||||
break;
|
break;
|
||||||
case VT_BSTR:
|
case VT_BSTR:
|
||||||
if (V_BSTR(v)) {
|
if (V_BSTR(v)) {
|
||||||
ZVAL_UNICODE(z, V_BSTR(v), 1);
|
if (UG(unicode)) {
|
||||||
|
ZVAL_UNICODE(z, V_BSTR(v), 1);
|
||||||
|
} else {
|
||||||
|
Z_TYPE_P(z) = IS_STRING;
|
||||||
|
Z_STRVAL_P(z) = php_com_olestring_to_string(V_BSTR(v),
|
||||||
|
&Z_STRLEN_P(z), codepage TSRMLS_CC);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VT_UNKNOWN:
|
case VT_UNKNOWN:
|
||||||
|
|
|
@ -33,6 +33,8 @@
|
||||||
#undef php_win_err
|
#undef php_win_err
|
||||||
|
|
||||||
typedef struct _php_com_dotnet_object {
|
typedef struct _php_com_dotnet_object {
|
||||||
|
zend_object zo;
|
||||||
|
|
||||||
VARIANT v;
|
VARIANT v;
|
||||||
|
|
||||||
ITypeInfo *typeinfo;
|
ITypeInfo *typeinfo;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue