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.c59
1 files changed, 23 insertions, 36 deletions
diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c
index 36fbff123c..737a3f84a5 100644
--- a/ext/xmlrpc/xmlrpc-epi-php.c
+++ b/ext/xmlrpc/xmlrpc-epi-php.c
@@ -51,8 +51,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
-
/**********************************************************************
* BUGS: *
* - when calling a php user function, there appears to be no way to *
@@ -141,7 +139,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_xmlrpc_server_register_introspection_callback, 0,
ZEND_END_ARG_INFO()
/* }}} */
-const zend_function_entry xmlrpc_functions[] = {
+static const zend_function_entry xmlrpc_functions[] = {
PHP_FE(xmlrpc_encode, arginfo_xmlrpc_encode)
PHP_FE(xmlrpc_decode, arginfo_xmlrpc_decode)
PHP_FE(xmlrpc_decode_request, arginfo_xmlrpc_decode_request)
@@ -279,9 +277,9 @@ static void destroy_server_data(xmlrpc_server_data *server)
static void xmlrpc_server_destructor(zend_resource *rsrc)
{
if (rsrc && rsrc->ptr) {
- rsrc->gc.refcount++;
+ GC_ADDREF(rsrc);
destroy_server_data((xmlrpc_server_data*) rsrc->ptr);
- rsrc->gc.refcount--;
+ GC_DELREF(rsrc);
}
}
@@ -298,7 +296,6 @@ PHP_MINFO_FUNCTION(xmlrpc)
{
php_info_print_table_start();
php_info_print_table_row(2, "core library version", XMLRPC_GetVersionString());
- php_info_print_table_row(2, "php extension version", PHP_XMLRPC_VERSION);
php_info_print_table_row(2, "author", "Dan Libby");
php_info_print_table_row(2, "homepage", "http://xmlrpc-epi.sourceforge.net");
php_info_print_table_row(2, "open sourced by", "Epinions.com");
@@ -516,11 +513,9 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep
XMLRPC_SetValueID(xReturn, key, 0);
} else {
if (Z_TYPE(val) != IS_STRING) {
- zval newvalue;
- ZVAL_DUP(&newvalue, &val);
- convert_to_string(&newvalue);
- xReturn = XMLRPC_CreateValueBase64(key, Z_STRVAL(newvalue), Z_STRLEN(newvalue));
- zval_dtor(&newvalue);
+ zend_string *str = zval_get_string_func(&val);
+ xReturn = XMLRPC_CreateValueBase64(key, ZSTR_VAL(str), ZSTR_LEN(str));
+ zend_string_release_ex(str, 0);
} else {
xReturn = XMLRPC_CreateValueBase64(key, Z_STRVAL(val), Z_STRLEN(val));
}
@@ -556,9 +551,12 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep
XMLRPC_VECTOR_TYPE vtype;
ht = HASH_OF(&val);
- if (ht && ht->u.v.nApplyCount > 1) {
- zend_throw_error(NULL, "XML-RPC doesn't support circular references");
- return NULL;
+ if (ht && !(GC_FLAGS(ht) & GC_IMMUTABLE)) {
+ if (GC_IS_RECURSIVE(ht)) {
+ zend_throw_error(NULL, "XML-RPC doesn't support circular references");
+ return NULL;
+ }
+ GC_PROTECT_RECURSION(ht);
}
ZVAL_COPY(&val_arr, &val);
@@ -569,10 +567,6 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(val_arr), num_index, my_key, pIter) {
ZVAL_DEREF(pIter);
- ht = HASH_OF(pIter);
- if (ht) {
- ht->u.v.nApplyCount++;
- }
if (my_key == NULL) {
char *num_str = NULL;
@@ -587,10 +581,10 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep
} else {
XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(ZSTR_VAL(my_key), pIter, depth++));
}
- if (ht) {
- ht->u.v.nApplyCount--;
- }
} ZEND_HASH_FOREACH_END();
+ if (ht && !(GC_FLAGS(ht) & GC_IMMUTABLE)) {
+ GC_UNPROTECT_RECURSION(ht);
+ }
zval_ptr_dtor(&val_arr);
}
break;
@@ -959,7 +953,7 @@ static void php_xmlrpc_introspection_callback(XMLRPC_SERVER server, void* data)
} else {
php_error_docref(NULL, E_WARNING, "Invalid callback '%s' passed", ZSTR_VAL(php_function_name));
}
- zend_string_release(php_function_name);
+ zend_string_release_ex(php_function_name, 0);
} ZEND_HASH_FOREACH_END();
/* so we don't call the same callbacks ever again */
@@ -990,9 +984,7 @@ PHP_FUNCTION(xmlrpc_server_register_method)
if (XMLRPC_ServerRegisterMethod(server->server_ptr, method_key, php_xmlrpc_callback)) {
/* save for later use */
- if (Z_REFCOUNTED_P(method_name)) {
- Z_ADDREF_P(method_name);
- }
+ Z_TRY_ADDREF_P(method_name);
/* register our php method */
add_zval(&server->method_map, method_key, method_name);
@@ -1016,9 +1008,7 @@ PHP_FUNCTION(xmlrpc_server_register_introspection_callback)
RETURN_FALSE;
}
- if (Z_REFCOUNTED_P(method_name)) {
- Z_ADDREF_P(method_name);
- }
+ Z_TRY_ADDREF_P(method_name);
/* register our php method */
add_zval(&server->introspection_map, NULL, method_name);
@@ -1042,7 +1032,7 @@ PHP_FUNCTION(xmlrpc_server_call_method)
php_output_options out;
int argc = ZEND_NUM_ARGS();
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsz|a", &handle, &rawxml, &rawxml_len, &caller_params, &output_opts) != SUCCESS) {
+ if (zend_parse_parameters(argc, "rsz|a", &handle, &rawxml, &rawxml_len, &caller_params, &output_opts) != SUCCESS) {
return;
}
/* user output options */
@@ -1304,9 +1294,8 @@ int set_zval_xmlrpc_type(zval* value, XMLRPC_VALUE_TYPE newtype) /* {{{ */
ZVAL_LONG(&ztimestamp, timestamp);
convert_to_object(value);
- if (zend_hash_str_update(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR) - 1, &type)) {
- bSuccess = (zend_hash_str_update(Z_OBJPROP_P(value), OBJECT_VALUE_TS_ATTR, sizeof(OBJECT_VALUE_TS_ATTR) - 1, &ztimestamp) != NULL)? SUCCESS : FAILURE;
- }
+ zend_hash_str_update(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR) - 1, &type);
+ bSuccess = (zend_hash_str_update(Z_OBJPROP_P(value), OBJECT_VALUE_TS_ATTR, sizeof(OBJECT_VALUE_TS_ATTR) - 1, &ztimestamp) != NULL)? SUCCESS : FAILURE;
} else {
zval_ptr_dtor(&type);
}
@@ -1316,7 +1305,8 @@ int set_zval_xmlrpc_type(zval* value, XMLRPC_VALUE_TYPE newtype) /* {{{ */
}
} else {
convert_to_object(value);
- bSuccess = (zend_hash_str_update(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR) - 1, &type) != NULL)? SUCCESS : FAILURE;
+ zend_hash_str_update(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR) - 1, &type);
+ bSuccess = SUCCESS;
}
}
}
@@ -1352,9 +1342,6 @@ XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(zval* value, zval* newvalue) /* {{{ */
case IS_DOUBLE:
type = xmlrpc_double;
break;
- case IS_CONSTANT:
- type = xmlrpc_string;
- break;
case IS_STRING:
type = xmlrpc_string;
break;