Skip to content

Commit e9aa033

Browse files
committed
Fix more dl() interned string assertions
1 parent bfadd9f commit e9aa033

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

Zend/zend_API.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2279,14 +2279,14 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
22792279
return FAILURE;
22802280
}
22812281
}
2282-
lowercase_name = zend_string_tolower_ex(internal_function->function_name, 1);
2282+
lowercase_name = zend_string_tolower_ex(internal_function->function_name, type == MODULE_PERSISTENT);
22832283
lowercase_name = zend_new_interned_string(lowercase_name);
22842284
reg_function = malloc(sizeof(zend_internal_function));
22852285
memcpy(reg_function, &function, sizeof(zend_internal_function));
22862286
if (zend_hash_add_ptr(target_function_table, lowercase_name, reg_function) == NULL) {
22872287
unload=1;
22882288
free(reg_function);
2289-
zend_string_release_ex(lowercase_name, 1);
2289+
zend_string_release(lowercase_name);
22902290
break;
22912291
}
22922292

@@ -2378,7 +2378,7 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
23782378
}
23792379
ptr++;
23802380
count++;
2381-
zend_string_release_ex(lowercase_name, 1);
2381+
zend_string_release(lowercase_name);
23822382
}
23832383
if (unload) { /* before unloading, display all remaining bad function in the module */
23842384
if (scope) {
@@ -2724,10 +2724,10 @@ static zend_class_entry *do_register_internal_class(zend_class_entry *orig_class
27242724
class_entry->info.internal.module = EG(current_module);
27252725

27262726
if (class_entry->info.internal.builtin_functions) {
2727-
zend_register_functions(class_entry, class_entry->info.internal.builtin_functions, &class_entry->function_table, MODULE_PERSISTENT);
2727+
zend_register_functions(class_entry, class_entry->info.internal.builtin_functions, &class_entry->function_table, EG(current_module)->type);
27282728
}
27292729

2730-
lowercase_name = zend_string_tolower_ex(orig_class_entry->name, 1);
2730+
lowercase_name = zend_string_tolower_ex(orig_class_entry->name, EG(current_module)->type == MODULE_PERSISTENT);
27312731
lowercase_name = zend_new_interned_string(lowercase_name);
27322732
zend_hash_update_ptr(CG(class_table), lowercase_name, class_entry);
27332733
zend_string_release_ex(lowercase_name, 1);
@@ -2786,6 +2786,11 @@ ZEND_API int zend_register_class_alias_ex(const char *name, size_t name_len, zen
27862786
{
27872787
zend_string *lcname;
27882788

2789+
/* TODO: Move this out of here in 7.4. */
2790+
if (persistent && EG(current_module) && EG(current_module)->type == MODULE_TEMPORARY) {
2791+
persistent = 0;
2792+
}
2793+
27892794
if (name[0] == '\\') {
27902795
lcname = zend_string_alloc(name_len-1, persistent);
27912796
zend_str_tolower_copy(ZSTR_VAL(lcname), name+1, name_len-1);
@@ -3696,6 +3701,11 @@ static inline zend_string *zval_make_interned_string(zval *zv) /* {{{ */
36963701
return Z_STR_P(zv);
36973702
}
36983703

3704+
static zend_always_inline zend_bool is_persistent_class(zend_class_entry *ce) {
3705+
return (ce->type & ZEND_INTERNAL_CLASS)
3706+
&& ce->info.internal.module->type == MODULE_PERSISTENT;
3707+
}
3708+
36993709
ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment) /* {{{ */
37003710
{
37013711
zend_property_info *property_info, *property_info_ptr;
@@ -3761,10 +3771,10 @@ ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, z
37613771
if (access_type & ZEND_ACC_PUBLIC) {
37623772
property_info->name = zend_string_copy(name);
37633773
} else if (access_type & ZEND_ACC_PRIVATE) {
3764-
property_info->name = zend_mangle_property_name(ZSTR_VAL(ce->name), ZSTR_LEN(ce->name), ZSTR_VAL(name), ZSTR_LEN(name), ce->type & ZEND_INTERNAL_CLASS);
3774+
property_info->name = zend_mangle_property_name(ZSTR_VAL(ce->name), ZSTR_LEN(ce->name), ZSTR_VAL(name), ZSTR_LEN(name), is_persistent_class(ce));
37653775
} else {
37663776
ZEND_ASSERT(access_type & ZEND_ACC_PROTECTED);
3767-
property_info->name = zend_mangle_property_name("*", 1, ZSTR_VAL(name), ZSTR_LEN(name), ce->type & ZEND_INTERNAL_CLASS);
3777+
property_info->name = zend_mangle_property_name("*", 1, ZSTR_VAL(name), ZSTR_LEN(name), is_persistent_class(ce));
37683778
}
37693779

37703780
property_info->name = zend_new_interned_string(property_info->name);
@@ -3779,7 +3789,7 @@ ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, z
37793789

37803790
ZEND_API int zend_declare_property(zend_class_entry *ce, const char *name, size_t name_length, zval *property, int access_type) /* {{{ */
37813791
{
3782-
zend_string *key = zend_string_init(name, name_length, ce->type & ZEND_INTERNAL_CLASS);
3792+
zend_string *key = zend_string_init(name, name_length, is_persistent_class(ce));
37833793
int ret = zend_declare_property_ex(ce, key, property, access_type, NULL);
37843794
zend_string_release(key);
37853795
return ret;

0 commit comments

Comments
 (0)