Skip to content

Commit 027b210

Browse files
committed
Merge branch 'PHP-8.3'
* PHP-8.3: Revert "Fix bug #69280: SoapClient classmap doesn't support fully qualified class name (#14398)"
2 parents a49e0a4 + 1d56340 commit 027b210

File tree

6 files changed

+14
-144
lines changed

6 files changed

+14
-144
lines changed

ext/soap/php_encoding.c

Lines changed: 6 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -457,8 +457,11 @@ static xmlNodePtr master_to_xml_int(encodePtr encode, zval *data, int style, xml
457457
zend_string *type_name;
458458

459459
ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(SOAP_GLOBAL(class_map), type_name, tmp) {
460-
if (ZSTR_LEN(ce->name) == Z_STRLEN_P(tmp) &&
461-
zend_binary_strncasecmp(ZSTR_VAL(ce->name), ZSTR_LEN(ce->name), Z_STRVAL_P(tmp), ZSTR_LEN(ce->name), ZSTR_LEN(ce->name)) == 0) {
460+
ZVAL_DEREF(tmp);
461+
if (Z_TYPE_P(tmp) == IS_STRING &&
462+
ZSTR_LEN(ce->name) == Z_STRLEN_P(tmp) &&
463+
zend_binary_strncasecmp(ZSTR_VAL(ce->name), ZSTR_LEN(ce->name), Z_STRVAL_P(tmp), ZSTR_LEN(ce->name), ZSTR_LEN(ce->name)) == 0 &&
464+
type_name) {
462465

463466
/* TODO: namespace isn't stored */
464467
encodePtr enc = NULL;
@@ -1392,6 +1395,7 @@ static zval *to_zval_object_ex(zval *ret, encodeTypePtr type, xmlNodePtr data, z
13921395
classname = zend_hash_str_find_deref(SOAP_GLOBAL(class_map), type->type_str, strlen(type->type_str));
13931396
}
13941397
if (classname != NULL &&
1398+
Z_TYPE_P(classname) == IS_STRING &&
13951399
(tmp = zend_fetch_class(Z_STR_P(classname), ZEND_FETCH_CLASS_AUTO)) != NULL) {
13961400
ce = tmp;
13971401
}
@@ -3669,48 +3673,3 @@ void delete_encoder_persistent(zval *zv)
36693673
assert(t->details.map == NULL);
36703674
free(t);
36713675
}
3672-
3673-
/* Normalize leading backslash similarly to how the engine strips it away. */
3674-
static inline zend_string *drop_leading_backslash(zend_string *str) {
3675-
if (ZSTR_VAL(str)[0] == '\\') {
3676-
return zend_string_init(ZSTR_VAL(str) + 1, ZSTR_LEN(str) - 1, false);
3677-
} else {
3678-
return zend_string_copy(str);
3679-
}
3680-
}
3681-
3682-
static HashTable *create_normalized_classmap_copy(HashTable *class_map)
3683-
{
3684-
HashTable *normalized = zend_new_array(zend_hash_num_elements(class_map));
3685-
3686-
zend_string *key;
3687-
zval *value;
3688-
ZEND_HASH_FOREACH_STR_KEY_VAL(class_map, key, value) {
3689-
ZVAL_DEREF(value);
3690-
3691-
if (key != NULL && Z_TYPE_P(value) == IS_STRING) {
3692-
zval zv;
3693-
ZVAL_STR(&zv, drop_leading_backslash(Z_STR_P(value)));
3694-
zend_hash_add_new(normalized, key, &zv);
3695-
}
3696-
} ZEND_HASH_FOREACH_END();
3697-
3698-
return normalized;
3699-
}
3700-
3701-
void create_normalized_classmap(zval *return_value, zval *class_map)
3702-
{
3703-
/* Check if we need to make a copy. */
3704-
zend_string *key;
3705-
zval *value;
3706-
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARR_P(class_map), key, value) {
3707-
if (key == NULL || Z_TYPE_P(value) != IS_STRING || ZSTR_VAL(Z_STR_P(value))[0] == '\\') {
3708-
/* TODO: should probably throw in some of these cases to indicate programmer error,
3709-
* e.g. in the case where a non-string (after dereferencing) is provided. */
3710-
RETURN_ARR(create_normalized_classmap_copy(Z_ARR_P(class_map)));
3711-
}
3712-
} ZEND_HASH_FOREACH_END();
3713-
3714-
/* We didn't have to make an actual copy, just increment the refcount. */
3715-
RETURN_COPY(class_map);
3716-
}

ext/soap/php_encoding.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,6 @@ encodePtr get_conversion(int encode);
215215
void delete_encoder(zval *zv);
216216
void delete_encoder_persistent(zval *zv);
217217

218-
void create_normalized_classmap(zval *return_value, zval *class_map);
219-
220218
extern encode defaultEncoding[];
221219
extern int numDefaultEncodings;
222220

ext/soap/php_soap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ struct _soapService {
9494
char *actor;
9595
char *uri;
9696
xmlCharEncodingHandlerPtr encoding;
97-
zval class_map;
97+
HashTable *class_map;
9898
int features;
9999
int send_errors;
100100
struct _soapHeader **soap_headers_ptr;

ext/soap/soap.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -954,7 +954,7 @@ PHP_METHOD(SoapServer, __construct)
954954

955955
if ((tmp = zend_hash_str_find(ht, "classmap", sizeof("classmap")-1)) != NULL &&
956956
Z_TYPE_P(tmp) == IS_ARRAY) {
957-
create_normalized_classmap(&service->class_map, tmp);
957+
service->class_map = zend_array_dup(Z_ARRVAL_P(tmp));
958958
}
959959

960960
if ((tmp = zend_hash_str_find(ht, "typemap", sizeof("typemap")-1)) != NULL &&
@@ -1402,7 +1402,7 @@ PHP_METHOD(SoapServer, handle)
14021402
old_encoding = SOAP_GLOBAL(encoding);
14031403
SOAP_GLOBAL(encoding) = service->encoding;
14041404
old_class_map = SOAP_GLOBAL(class_map);
1405-
SOAP_GLOBAL(class_map) = Z_ARR(service->class_map);
1405+
SOAP_GLOBAL(class_map) = service->class_map;
14061406
old_typemap = SOAP_GLOBAL(typemap);
14071407
SOAP_GLOBAL(typemap) = service->typemap;
14081408
old_features = SOAP_GLOBAL(features);
@@ -2087,7 +2087,7 @@ PHP_METHOD(SoapClient, __construct)
20872087
}
20882088
if ((tmp = zend_hash_str_find(ht, "classmap", sizeof("classmap")-1)) != NULL &&
20892089
Z_TYPE_P(tmp) == IS_ARRAY) {
2090-
create_normalized_classmap(Z_CLIENT_CLASSMAP_P(this_ptr), tmp);
2090+
ZVAL_COPY(Z_CLIENT_CLASSMAP_P(this_ptr), tmp);
20912091
}
20922092

20932093
if ((tmp = zend_hash_str_find(ht, "typemap", sizeof("typemap")-1)) != NULL &&
@@ -4524,7 +4524,10 @@ static void delete_service(soapServicePtr service) /* {{{ */
45244524
if (service->encoding) {
45254525
xmlCharEncCloseFunc(service->encoding);
45264526
}
4527-
zval_ptr_dtor(&service->class_map);
4527+
if (service->class_map) {
4528+
zend_hash_destroy(service->class_map);
4529+
FREE_HASHTABLE(service->class_map);
4530+
}
45284531
zval_ptr_dtor(&service->soap_object);
45294532
efree(service);
45304533
}

ext/soap/tests/bug69280.phpt

Lines changed: 0 additions & 44 deletions
This file was deleted.

ext/soap/tests/bug69280.wsdl

Lines changed: 0 additions & 46 deletions
This file was deleted.

0 commit comments

Comments
 (0)