summaryrefslogtreecommitdiff
path: root/ext/xmlrpc/xmlrpc-epi-php.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/xmlrpc/xmlrpc-epi-php.c')
-rw-r--r--ext/xmlrpc/xmlrpc-epi-php.c42
1 files changed, 22 insertions, 20 deletions
diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c
index 737a3f84a5..64ae65eec8 100644
--- a/ext/xmlrpc/xmlrpc-epi-php.c
+++ b/ext/xmlrpc/xmlrpc-epi-php.c
@@ -37,7 +37,7 @@
+----------------------------------------------------------------------+
| PHP Version 7 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2018 The PHP Group |
+ | Copyright (c) The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -522,7 +522,9 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep
}
break;
case xmlrpc_datetime:
- convert_to_string(&val);
+ if (!try_convert_to_string(&val)) {
+ return NULL;
+ }
xReturn = XMLRPC_CreateValueDateTime_ISO8601(key, Z_STRVAL(val));
break;
case xmlrpc_boolean:
@@ -538,7 +540,9 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep
xReturn = XMLRPC_CreateValueDouble(key, Z_DVAL(val));
break;
case xmlrpc_string:
- convert_to_string(&val);
+ if (!try_convert_to_string(&val)) {
+ return NULL;
+ }
xReturn = XMLRPC_CreateValueString(key, Z_STRVAL(val), Z_STRLEN(val));
break;
case xmlrpc_vector:
@@ -764,10 +768,8 @@ void decode_request_worker(char *xml_in, int xml_in_len, char *encoding_in, zval
if (method_name_out) {
method_name = XMLRPC_RequestGetMethodName(response);
if (method_name) {
- zval_ptr_dtor(method_name_out);
- ZVAL_STRING(method_name_out, method_name);
+ ZEND_TRY_ASSIGN_REF_STRING(method_name_out, method_name);
} else {
- zval_ptr_dtor(retval);
ZVAL_NULL(retval);
}
}
@@ -787,7 +789,7 @@ PHP_FUNCTION(xmlrpc_decode_request)
zval *method;
size_t xml_len, encoding_len = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/|s", &xml, &xml_len, &method, &encoding, &encoding_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz|s", &xml, &xml_len, &method, &encoding, &encoding_len) == FAILURE) {
return;
}
@@ -896,7 +898,7 @@ static XMLRPC_VALUE php_xmlrpc_callback(XMLRPC_SERVER server, XMLRPC_REQUEST xRe
/* Use same C function for all methods */
/* php func prototype: function user_func($method_name, $xmlrpc_params, $user_params) */
- call_user_function(CG(function_table), NULL, &pData->php_function, &pData->return_data, 3, callback_params);
+ call_user_function(NULL, NULL, &pData->php_function, &pData->return_data, 3, callback_params);
pData->php_executed = 1;
@@ -922,12 +924,15 @@ static void php_xmlrpc_introspection_callback(XMLRPC_SERVER server, void* data)
ZEND_HASH_FOREACH_VAL(Z_ARRVAL(pData->server->introspection_map), php_function) {
if (zend_is_callable(php_function, 0, &php_function_name)) {
/* php func prototype: function string user_func($user_params) */
- if (call_user_function(CG(function_table), NULL, php_function, &retval, 1, callback_params) == SUCCESS) {
+ if (call_user_function(NULL, NULL, php_function, &retval, 1, callback_params) == SUCCESS) {
XMLRPC_VALUE xData;
STRUCT_XMLRPC_ERROR err = {0};
/* return value should be a string */
- convert_to_string(&retval);
+ if (!try_convert_to_string(&retval)) {
+ zend_string_release_ex(php_function_name, 0);
+ break;
+ }
xData = XMLRPC_IntrospectionCreateDescription(Z_STRVAL(retval), &err);
@@ -1262,7 +1267,7 @@ XMLRPC_VECTOR_TYPE xmlrpc_str_as_vector_type(const char* str) /* {{{ */
}
}
}
- return xmlrpc_none;
+ return xmlrpc_vector_none;
}
/* }}} */
@@ -1389,15 +1394,19 @@ PHP_FUNCTION(xmlrpc_set_type)
size_t type_len;
XMLRPC_VALUE_TYPE vtype;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "z/s", &arg, &type, &type_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs", &arg, &type, &type_len) == FAILURE) {
return;
}
vtype = xmlrpc_str_as_type(type);
if (vtype != xmlrpc_none) {
- if (set_zval_xmlrpc_type(arg, vtype) == SUCCESS) {
+ zval tmp;
+ ZVAL_COPY(&tmp, Z_REFVAL_P(arg));
+ if (set_zval_xmlrpc_type(&tmp, vtype) == SUCCESS) {
+ ZEND_TRY_ASSIGN_REF_TMP(arg, &tmp);
RETURN_TRUE;
}
+ Z_TRY_DELREF(tmp);
} else {
zend_error(E_WARNING,"invalid type '%s' passed to xmlrpc_set_type()", type);
}
@@ -1450,10 +1459,3 @@ PHP_FUNCTION(xmlrpc_is_fault)
RETURN_FALSE;
}
/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- */