diff options
Diffstat (limited to 'ext/xmlrpc/xmlrpc-epi-php.c')
-rw-r--r-- | ext/xmlrpc/xmlrpc-epi-php.c | 59 |
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; |