Skip to content

Commit 079409b

Browse files
committed
Switch (un)mangle property name to size_t and zend_string
Also use the _ex variants where possible.
1 parent 6991780 commit 079409b

12 files changed

+70
-65
lines changed

Zend/zend.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ static void print_hash(zend_write_func_t write_func, HashTable *ht, int indent,
156156
if (string_key) {
157157
if (is_object) {
158158
const char *prop_name, *class_name;
159-
int prop_len;
160-
int mangled = zend_unmangle_property_name_ex(string_key->val, string_key->len, &class_name, &prop_name, &prop_len);
159+
size_t prop_len;
160+
int mangled = zend_unmangle_property_name_ex(string_key, &class_name, &prop_name, &prop_len);
161161

162162
ZEND_WRITE_EX(prop_name, prop_len);
163163
if (class_name && mangled == SUCCESS) {

Zend/zend_builtin_functions.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -1036,8 +1036,6 @@ ZEND_FUNCTION(get_object_vars)
10361036
zval *value;
10371037
HashTable *properties;
10381038
zend_string *key;
1039-
const char *prop_name, *class_name;
1040-
uint prop_len;
10411039
zend_object *zobj;
10421040

10431041
#ifndef FAST_ZPP
@@ -1070,7 +1068,9 @@ ZEND_FUNCTION(get_object_vars)
10701068
/* Not separating references */
10711069
if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
10721070
if (key->val[0] == 0) {
1073-
zend_unmangle_property_name_ex(key->val, key->len, &class_name, &prop_name, (int*) &prop_len);
1071+
const char *prop_name, *class_name;
1072+
size_t prop_len;
1073+
zend_unmangle_property_name_ex(key, &class_name, &prop_name, &prop_len);
10741074
zend_hash_str_add_new(Z_ARRVAL_P(return_value), prop_name, prop_len, value);
10751075
} else {
10761076
zend_hash_add_new(Z_ARRVAL_P(return_value), key, value);

Zend/zend_compile.c

+23-24
Original file line numberDiff line numberDiff line change
@@ -2300,10 +2300,10 @@ static void zend_do_traits_property_binding(zend_class_entry *ce TSRMLS_DC) /* {
23002300
prop_name = zend_string_copy(property_info->name);
23012301
} else {
23022302
const char *pname;
2303-
int pname_len;
2303+
size_t pname_len;
23042304

23052305
/* for private and protected we need to unmangle the names */
2306-
zend_unmangle_property_name_ex(property_info->name->val, property_info->name->len,
2306+
zend_unmangle_property_name_ex(property_info->name,
23072307
&class_name_unused, &pname, &pname_len);
23082308
prop_name = zend_string_init(pname, pname_len, 0);
23092309
}
@@ -2668,63 +2668,62 @@ ZEND_API void zend_do_delayed_early_binding(const zend_op_array *op_array TSRMLS
26682668
}
26692669
/* }}} */
26702670

2671-
ZEND_API zend_string *zend_mangle_property_name(const char *src1, int src1_length, const char *src2, int src2_length, int internal) /* {{{ */
2671+
ZEND_API zend_string *zend_mangle_property_name(const char *src1, size_t src1_length, const char *src2, size_t src2_length, int internal) /* {{{ */
26722672
{
2673-
zend_string *prop_name;
2674-
int prop_name_length;
2673+
size_t prop_name_length = 1 + src1_length + 1 + src2_length;
2674+
zend_string *prop_name = zend_string_alloc(prop_name_length, internal);
26752675

2676-
prop_name_length = 1 + src1_length + 1 + src2_length;
2677-
prop_name = zend_string_alloc(prop_name_length, internal);
26782676
prop_name->val[0] = '\0';
26792677
memcpy(prop_name->val + 1, src1, src1_length+1);
26802678
memcpy(prop_name->val + 1 + src1_length + 1, src2, src2_length+1);
26812679
return prop_name;
26822680
}
26832681
/* }}} */
26842682

2685-
static int zend_strnlen(const char* s, int maxlen) /* {{{ */
2683+
static int zend_strnlen(const char* s, size_t maxlen) /* {{{ */
26862684
{
2687-
int len = 0;
2685+
size_t len = 0;
26882686
while (*s++ && maxlen--) len++;
26892687
return len;
26902688
}
26912689
/* }}} */
26922690

2693-
ZEND_API int zend_unmangle_property_name_ex(const char *mangled_property, int len, const char **class_name, const char **prop_name, int *prop_len) /* {{{ */
2691+
ZEND_API int zend_unmangle_property_name_ex(const zend_string *name, const char **class_name, const char **prop_name, size_t *prop_len) /* {{{ */
26942692
{
2695-
int class_name_len;
2693+
size_t class_name_len;
26962694

26972695
*class_name = NULL;
26982696

2699-
if (mangled_property[0]!=0) {
2700-
*prop_name = mangled_property;
2697+
if (name->val[0] != '\0') {
2698+
*prop_name = name->val;
27012699
if (prop_len) {
2702-
*prop_len = len;
2700+
*prop_len = name->len;
27032701
}
27042702
return SUCCESS;
27052703
}
2706-
if (len < 3 || mangled_property[1]==0) {
2704+
if (name->len < 3 || name->val[1] == '\0') {
27072705
zend_error(E_NOTICE, "Illegal member variable name");
2708-
*prop_name = mangled_property;
2706+
*prop_name = name->val;
27092707
if (prop_len) {
2710-
*prop_len = len;
2708+
*prop_len = name->len;
27112709
}
27122710
return FAILURE;
27132711
}
27142712

2715-
class_name_len = zend_strnlen(mangled_property + 1, --len - 1) + 1;
2716-
if (class_name_len >= len || mangled_property[class_name_len]!=0) {
2713+
class_name_len = zend_strnlen(name->val + 1, name->len - 2);
2714+
if (class_name_len >= name->len - 2 || name->val[class_name_len + 1] != '\0') {
27172715
zend_error(E_NOTICE, "Corrupt member variable name");
2718-
*prop_name = mangled_property;
2716+
*prop_name = name->val;
27192717
if (prop_len) {
2720-
*prop_len = len + 1;
2718+
*prop_len = name->len;
27212719
}
27222720
return FAILURE;
27232721
}
2724-
*class_name = mangled_property + 1;
2725-
*prop_name = (*class_name) + class_name_len;
2722+
2723+
*class_name = name->val + 1;
2724+
*prop_name = name->val + class_name_len + 2;
27262725
if (prop_len) {
2727-
*prop_len = len - class_name_len;
2726+
*prop_len = name->len - class_name_len - 2;
27282727
}
27292728
return SUCCESS;
27302729
}

Zend/zend_compile.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -499,10 +499,10 @@ ZEND_API void zend_function_dtor(zval *zv);
499499
ZEND_API void destroy_zend_class(zval *zv);
500500
void zend_class_add_ref(zval *zv);
501501

502-
ZEND_API zend_string *zend_mangle_property_name(const char *src1, int src1_length, const char *src2, int src2_length, int internal);
503-
#define zend_unmangle_property_name(mangled_property, mangled_property_len, class_name, prop_name) \
504-
zend_unmangle_property_name_ex(mangled_property, mangled_property_len, class_name, prop_name, NULL)
505-
ZEND_API int zend_unmangle_property_name_ex(const char *mangled_property, int mangled_property_len, const char **class_name, const char **prop_name, int *prop_len);
502+
ZEND_API zend_string *zend_mangle_property_name(const char *src1, size_t src1_length, const char *src2, size_t src2_length, int internal);
503+
#define zend_unmangle_property_name(mangled_property, class_name, prop_name) \
504+
zend_unmangle_property_name_ex(mangled_property, class_name, prop_name, NULL)
505+
ZEND_API int zend_unmangle_property_name_ex(const zend_string *name, const char **class_name, const char **prop_name, size_t *prop_len);
506506

507507
#define ZEND_FUNCTION_DTOR zend_function_dtor
508508
#define ZEND_CLASS_DTOR destroy_zend_class

Zend/zend_object_handlers.c

+6-4
Original file line numberDiff line numberDiff line change
@@ -397,10 +397,10 @@ ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_inf
397397
const char *class_name = NULL;
398398
const char *prop_name;
399399
zend_string *member;
400-
int prop_name_len;
400+
size_t prop_name_len;
401401

402402
if (prop_info_name->val[0] == 0) {
403-
zend_unmangle_property_name_ex(prop_info_name->val, prop_info_name->len, &class_name, &prop_name, &prop_name_len);
403+
zend_unmangle_property_name_ex(prop_info_name, &class_name, &prop_name, &prop_name_len);
404404
member = zend_string_init(prop_name, prop_name_len, 0);
405405
} else {
406406
member = zend_string_copy(prop_info_name);
@@ -434,10 +434,12 @@ static zend_long *zend_get_property_guard(zend_object *zobj, zend_property_info
434434
info.name = Z_STR_P(member);
435435
} else if(property_info->name->val[0] == '\0'){
436436
const char *class_name = NULL, *prop_name = NULL;
437-
zend_unmangle_property_name(property_info->name->val, property_info->name->len, &class_name, &prop_name);
437+
size_t prop_name_len;
438+
zend_unmangle_property_name_ex(property_info->name, &class_name,
439+
&prop_name, &prop_name_len);
438440
if (class_name) {
439441
/* use unmangled name for protected properties */
440-
str = info.name = zend_string_init(prop_name, strlen(prop_name), 0);
442+
str = info.name = zend_string_init(prop_name, prop_name_len, 0);
441443
property_info = &info;
442444
}
443445
}

Zend/zend_vm_def.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -4811,9 +4811,9 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
48114811
}
48124812
} else {
48134813
const char *class_name, *prop_name;
4814-
int prop_name_len;
4814+
size_t prop_name_len;
48154815
zend_unmangle_property_name_ex(
4816-
p->key->val, p->key->len, &class_name, &prop_name, &prop_name_len);
4816+
p->key, &class_name, &prop_name, &prop_name_len);
48174817
ZVAL_STRINGL(EX_VAR((opline+1)->result.var), prop_name, prop_name_len);
48184818
}
48194819
}

Zend/zend_vm_execute.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -16791,9 +16791,9 @@ static int ZEND_FASTCALL ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
1679116791
}
1679216792
} else {
1679316793
const char *class_name, *prop_name;
16794-
int prop_name_len;
16794+
size_t prop_name_len;
1679516795
zend_unmangle_property_name_ex(
16796-
p->key->val, p->key->len, &class_name, &prop_name, &prop_name_len);
16796+
p->key, &class_name, &prop_name, &prop_name_len);
1679716797
ZVAL_STRINGL(EX_VAR((opline+1)->result.var), prop_name, prop_name_len);
1679816798
}
1679916799
}

ext/reflection/php_reflection.c

+17-13
Original file line numberDiff line numberDiff line change
@@ -941,7 +941,7 @@ static void _property_string(string *str, zend_property_info *prop, char *prop_n
941941
string_printf(str, "static ");
942942
}
943943

944-
zend_unmangle_property_name(prop->name->val, prop->name->len, &class_name, (const char**)&prop_name);
944+
zend_unmangle_property_name(prop->name, &class_name, (const char**)&prop_name);
945945
string_printf(str, "$%s", prop_name);
946946
}
947947

@@ -1298,9 +1298,9 @@ static void reflection_property_factory(zend_class_entry *ce, zend_property_info
12981298
zval classname;
12991299
property_reference *reference;
13001300
const char *class_name, *prop_name;
1301-
int prop_name_len;
1301+
size_t prop_name_len;
13021302

1303-
zend_unmangle_property_name_ex(prop->name->val, prop->name->len, &class_name, &prop_name, &prop_name_len);
1303+
zend_unmangle_property_name_ex(prop->name, &class_name, &prop_name, &prop_name_len);
13041304

13051305
if (!(prop->flags & ZEND_ACC_PRIVATE)) {
13061306
/* we have to search the class hierarchy for this (implicit) public or protected property */
@@ -4733,7 +4733,6 @@ ZEND_METHOD(reflection_property, __construct)
47334733
{
47344734
zval propname, cname, *classname;
47354735
char *name_str;
4736-
const char *class_name, *prop_name;
47374736
size_t name_len;
47384737
int dynam_prop = 0;
47394738
zval *object;
@@ -4797,9 +4796,11 @@ ZEND_METHOD(reflection_property, __construct)
47974796
}
47984797

47994798
if (dynam_prop == 0) {
4800-
zend_unmangle_property_name(property_info->name->val, property_info->name->len, &class_name, &prop_name);
4799+
const char *class_name, *prop_name;
4800+
size_t prop_name_len;
4801+
zend_unmangle_property_name_ex(property_info->name, &class_name, &prop_name, &prop_name_len);
48014802
ZVAL_STR(&cname, zend_string_copy(property_info->ce->name));
4802-
ZVAL_STRING(&propname, prop_name);
4803+
ZVAL_STRINGL(&propname, prop_name, prop_name_len);
48034804
} else {
48044805
ZVAL_STR(&cname, zend_string_copy(ce->name));
48054806
ZVAL_STRINGL(&propname, name_str, name_len);
@@ -4950,12 +4951,14 @@ ZEND_METHOD(reflection_property, getValue)
49504951
ZVAL_DUP(return_value, &CE_STATIC_MEMBERS(intern->ce)[ref->prop.offset]);
49514952
} else {
49524953
const char *class_name, *prop_name;
4954+
size_t prop_name_len;
49534955

49544956
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &object) == FAILURE) {
49554957
return;
49564958
}
4957-
zend_unmangle_property_name(ref->prop.name->val, ref->prop.name->len, &class_name, &prop_name);
4958-
member_p = zend_read_property(ref->ce, object, prop_name, strlen(prop_name), 1 TSRMLS_CC);
4959+
4960+
zend_unmangle_property_name_ex(ref->prop.name, &class_name, &prop_name, &prop_name_len);
4961+
member_p = zend_read_property(ref->ce, object, prop_name, prop_name_len, 1 TSRMLS_CC);
49594962
ZVAL_DUP(return_value, member_p);
49604963
}
49614964
}
@@ -5024,12 +5027,14 @@ ZEND_METHOD(reflection_property, setValue)
50245027
}
50255028
} else {
50265029
const char *class_name, *prop_name;
5030+
size_t prop_name_len;
50275031

50285032
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "oz", &object, &value) == FAILURE) {
50295033
return;
50305034
}
5031-
zend_unmangle_property_name(ref->prop.name->val, ref->prop.name->len, &class_name, &prop_name);
5032-
zend_update_property(ref->ce, object, prop_name, strlen(prop_name), value TSRMLS_CC);
5035+
5036+
zend_unmangle_property_name_ex(ref->prop.name, &class_name, &prop_name, &prop_name_len);
5037+
zend_update_property(ref->ce, object, prop_name, prop_name_len, value TSRMLS_CC);
50335038
}
50345039
}
50355040
/* }}} */
@@ -5043,18 +5048,17 @@ ZEND_METHOD(reflection_property, getDeclaringClass)
50435048
zend_class_entry *tmp_ce, *ce;
50445049
zend_property_info *tmp_info;
50455050
const char *prop_name, *class_name;
5046-
int prop_name_len;
5051+
size_t prop_name_len;
50475052

50485053
if (zend_parse_parameters_none() == FAILURE) {
50495054
return;
50505055
}
50515056
GET_REFLECTION_OBJECT_PTR(ref);
50525057

5053-
if (zend_unmangle_property_name(ref->prop.name->val, ref->prop.name->len, &class_name, &prop_name) != SUCCESS) {
5058+
if (zend_unmangle_property_name_ex(ref->prop.name, &class_name, &prop_name, &prop_name_len) != SUCCESS) {
50545059
RETURN_FALSE;
50555060
}
50565061

5057-
prop_name_len = strlen(prop_name);
50585062
ce = tmp_ce = ref->ce;
50595063
while (tmp_ce && (tmp_info = zend_hash_str_find_ptr(&tmp_ce->properties_info, prop_name, prop_name_len)) != NULL) {
50605064
if (tmp_info->flags & ZEND_ACC_PRIVATE || tmp_info->flags & ZEND_ACC_SHADOW) {

ext/soap/php_encoding.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1984,7 +1984,7 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo
19841984
if (Z_TYPE_P(data) == IS_OBJECT) {
19851985
const char *class_name;
19861986

1987-
zend_unmangle_property_name(str_key->val, str_key->len, &class_name, &prop_name);
1987+
zend_unmangle_property_name(str_key, &class_name, &prop_name);
19881988
} else {
19891989
prop_name = str_key->val;
19901990
}

ext/standard/http.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
6666
/* private or protected property access outside of the class */
6767
continue;
6868
}
69-
zend_unmangle_property_name_ex(key->val, key->len, &tmp, &prop_name, (int *)&prop_len);
69+
zend_unmangle_property_name_ex(key, &tmp, &prop_name, &prop_len);
7070
} else {
7171
prop_name = key->val;
7272
prop_len = key->len;

ext/standard/var.c

+6-7
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ static void php_object_property_dump(zval *zv, zend_ulong index, zend_string *ke
7474
if (key == NULL) { /* numeric key */
7575
php_printf("%*c[" ZEND_LONG_FMT "]=>\n", level + 1, ' ', index);
7676
} else { /* string key */
77-
int unmangle = zend_unmangle_property_name(key->val, key->len, &class_name, &prop_name);
77+
int unmangle = zend_unmangle_property_name(key, &class_name, &prop_name);
7878
php_printf("%*c[", level + 1, ' ');
7979

8080
if (class_name && unmangle == SUCCESS) {
@@ -247,7 +247,7 @@ static void zval_object_property_dump(zval *zv, zend_ulong index, zend_string *k
247247
if (key == NULL) { /* numeric key */
248248
php_printf("%*c[" ZEND_LONG_FMT "]=>\n", level + 1, ' ', index);
249249
} else { /* string key */
250-
zend_unmangle_property_name(key->val, key->len, &class_name, &prop_name);
250+
zend_unmangle_property_name(key, &class_name, &prop_name);
251251
php_printf("%*c[", level + 1, ' ');
252252

253253
if (class_name) {
@@ -430,13 +430,12 @@ static void php_object_element_export(zval *zv, zend_ulong index, zend_string *k
430430
{
431431
buffer_append_spaces(buf, level + 2);
432432
if (key != NULL) {
433-
const char *class_name; /* ignored, but must be passed to unmangle */
434-
const char *pname;
433+
const char *class_name, *prop_name;
434+
size_t prop_name_len;
435435
zend_string *pname_esc;
436436

437-
zend_unmangle_property_name(key->val, key->len,
438-
&class_name, &pname);
439-
pname_esc = php_addcslashes(pname, strlen(pname), 0, "'\\", 2 TSRMLS_CC);
437+
zend_unmangle_property_name_ex(key, &class_name, &prop_name, &prop_name_len);
438+
pname_esc = php_addcslashes(prop_name, prop_name_len, 0, "'\\", 2 TSRMLS_CC);
440439

441440
smart_str_appendc(buf, '\'');
442441
smart_str_appendl(buf, pname_esc->val, pname_esc->len);

ext/wddx/wddx.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -505,10 +505,11 @@ static void php_wddx_serialize_object(wddx_packet *packet, zval *obj)
505505
}
506506
if (key) {
507507
const char *class_name, *prop_name;
508+
size_t prop_name_len;
508509
zend_string *tmp;
509510

510-
zend_unmangle_property_name(key->val, key->len, &class_name, &prop_name);
511-
tmp = zend_string_init(prop_name, strlen(prop_name), 0);
511+
zend_unmangle_property_name_ex(key, &class_name, &prop_name, &prop_name_len);
512+
tmp = zend_string_init(prop_name, prop_name_len, 0);
512513
php_wddx_serialize_var(packet, ent, tmp TSRMLS_CC);
513514
zend_string_release(tmp);
514515
} else {

0 commit comments

Comments
 (0)