From ded9027b9f44f3cbd1b0a705256800728cc8f164 Mon Sep 17 00:00:00 2001 From: Alexander Danilov Date: Tue, 10 Nov 2026 20:22:12 +0200 Subject: [PATCH 1/5] ext/random: use ZSTR_LEN()/ZSTR_VAL() instead of direct member access --- ext/random/random.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/random/random.c b/ext/random/random.c index 5d341ef4cb73..87faa8dc17da 100644 --- a/ext/random/random.c +++ b/ext/random/random.c @@ -348,8 +348,8 @@ PHPAPI zend_string *php_random_bin2hex_le(const void *ptr, const size_t len) /* stolen from standard/string.c */ PHPAPI bool php_random_hex2bin_le(zend_string *hexstr, void *dest) { - size_t len = hexstr->len >> 1; - unsigned char *str = (unsigned char *) hexstr->val, c, l, d; + size_t len = ZSTR_LEN(hexstr) >> 1; + unsigned char *str = (unsigned char *) ZSTR_VAL(hexstr), c, l, d; unsigned char *ptr = (unsigned char *) dest; int is_letter, i = 0; From 0131aee4643303e3a50ba07e6dc8c9f3f868ae9a Mon Sep 17 00:00:00 2001 From: Alexander Danilov Date: Tue, 10 Nov 2026 20:22:12 +0200 Subject: [PATCH 2/5] ext/standard/mail: use ZSTR_LEN()/ZSTR_VAL() instead of direct member access --- ext/standard/mail.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/standard/mail.c b/ext/standard/mail.c index 346ed940d8d7..db22ef22b2f2 100644 --- a/ext/standard/mail.c +++ b/ext/standard/mail.c @@ -253,7 +253,7 @@ PHPAPI zend_string *php_mail_build_headers(const HashTable *headers) } ZEND_HASH_FOREACH_END(); /* Remove the last \r\n */ - if (s.s) s.s->len -= 2; + if (s.s) ZSTR_LEN(s.s) -= 2; smart_str_0(&s); return s.s; @@ -471,7 +471,7 @@ PHPAPI bool php_mail(const char *to, const char *subject, const char *message, c time(&curtime); date_str = php_format_date("d-M-Y H:i:s e", 13, curtime, 1); - len = spprintf(&tmp, 0, "[%s] %s%s", date_str->val, logline, PHP_EOL); + len = spprintf(&tmp, 0, "[%s] %s%s", ZSTR_VAL(date_str), logline, PHP_EOL); php_mail_log_to_file(mail_log, tmp, len); From d5ec85dfe94ef089b43ab9f1d37f4d2c93936b9a Mon Sep 17 00:00:00 2001 From: Alexander Danilov Date: Tue, 10 Nov 2026 20:22:12 +0200 Subject: [PATCH 3/5] Zend/Optimizer/zend_dump: use ZSTR_VAL() instead of direct member access --- Zend/Optimizer/zend_dump.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Zend/Optimizer/zend_dump.c b/Zend/Optimizer/zend_dump.c index c6cc5193b2dc..83dc8c8bab77 100644 --- a/Zend/Optimizer/zend_dump.c +++ b/Zend/Optimizer/zend_dump.c @@ -156,7 +156,7 @@ static void zend_dump_unused_op(const zend_op *opline, znode_op op, uint32_t fla ZEND_API void zend_dump_var(const zend_op_array *op_array, uint8_t var_type, uint32_t var_num) { if (var_type == IS_CV && var_num < op_array->last_var) { - fprintf(stderr, "CV%d($%s)", var_num, op_array->vars[var_num]->val); + fprintf(stderr, "CV%d($%s)", var_num, ZSTR_VAL(op_array->vars[var_num])); } else if (var_type == IS_VAR) { fprintf(stderr, "V%d", var_num); } else if ((var_type & (IS_VAR|IS_TMP_VAR)) == IS_TMP_VAR) { @@ -223,9 +223,9 @@ static void zend_dump_type_info(uint32_t info, const zend_class_entry *ce, bool fprintf(stderr, "class"); if (ce) { if (is_instanceof) { - fprintf(stderr, " (instanceof %s)", ce->name->val); + fprintf(stderr, " (instanceof %s)", ZSTR_VAL(ce->name)); } else { - fprintf(stderr, " (%s)", ce->name->val); + fprintf(stderr, " (%s)", ZSTR_VAL(ce->name)); } } } else if ((info & MAY_BE_ANY) == MAY_BE_ANY) { @@ -358,9 +358,9 @@ static void zend_dump_type_info(uint32_t info, const zend_class_entry *ce, bool fprintf(stderr, "object"); if (ce) { if (is_instanceof) { - fprintf(stderr, " (instanceof %s)", ce->name->val); + fprintf(stderr, " (instanceof %s)", ZSTR_VAL(ce->name)); } else { - fprintf(stderr, " (%s)", ce->name->val); + fprintf(stderr, " (%s)", ZSTR_VAL(ce->name)); } } } @@ -931,9 +931,9 @@ void zend_dump_op_array_name(const zend_op_array *op_array) { if (op_array->function_name) { if (op_array->scope && op_array->scope->name) { - fprintf(stderr, "%s::%s", op_array->scope->name->val, op_array->function_name->val); + fprintf(stderr, "%s::%s", ZSTR_VAL(op_array->scope->name), ZSTR_VAL(op_array->function_name)); } else { - fprintf(stderr, "%s", op_array->function_name->val); + fprintf(stderr, "%s", ZSTR_VAL(op_array->function_name)); } } else { fprintf(stderr, "%s", "$_main"); @@ -1017,7 +1017,7 @@ ZEND_API void zend_dump_op_array(const zend_op_array *op_array, uint32_t dump_fl if (msg) { fprintf(stderr, " ; (%s)\n", msg); } - fprintf(stderr, " ; %s:%u-%u\n", op_array->filename->val, op_array->line_start, op_array->line_end); + fprintf(stderr, " ; %s:%u-%u\n", ZSTR_VAL(op_array->filename), op_array->line_start, op_array->line_end); if (func_info) { fprintf(stderr, " ; return "); From f067407ca135b5e42167f3491022b8477f1c62ae Mon Sep 17 00:00:00 2001 From: Alexander Danilov Date: Tue, 10 Nov 2026 20:22:12 +0200 Subject: [PATCH 4/5] zend_operators: use ZSTR_VAL()/ZSTR_LEN() instead of direct member access --- Zend/zend_operators.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index b9d901b6560d..2960b4be1400 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -3449,8 +3449,8 @@ ZEND_API bool ZEND_FASTCALL zendi_smart_streq(const zend_string *s1, const zend_ zend_long lval1 = 0, lval2 = 0; double dval1 = 0.0, dval2 = 0.0; - if ((ret1 = is_numeric_string_ex(s1->val, s1->len, &lval1, &dval1, false, &oflow1, NULL)) && - (ret2 = is_numeric_string_ex(s2->val, s2->len, &lval2, &dval2, false, &oflow2, NULL))) { + if ((ret1 = is_numeric_string_ex(ZSTR_VAL(s1), ZSTR_LEN(s1), &lval1, &dval1, false, &oflow1, NULL)) && + (ret2 = is_numeric_string_ex(ZSTR_VAL(s2), ZSTR_LEN(s2), &lval2, &dval2, false, &oflow2, NULL))) { #if ZEND_ULONG_MAX == 0xFFFFFFFF if (oflow1 != 0 && oflow1 == oflow2 && dval1 - dval2 == 0. && ((oflow1 == 1 && dval1 > 9007199254740991. /*0x1FFFFFFFFFFFFF*/) @@ -3497,8 +3497,8 @@ ZEND_API int ZEND_FASTCALL zendi_smart_strcmp(const zend_string *s1, const zend_ zend_long lval1 = 0, lval2 = 0; double dval1 = 0.0, dval2 = 0.0; - if ((ret1 = is_numeric_string_ex(s1->val, s1->len, &lval1, &dval1, false, &oflow1, NULL)) && - (ret2 = is_numeric_string_ex(s2->val, s2->len, &lval2, &dval2, false, &oflow2, NULL))) { + if ((ret1 = is_numeric_string_ex(ZSTR_VAL(s1), ZSTR_LEN(s1), &lval1, &dval1, false, &oflow1, NULL)) && + (ret2 = is_numeric_string_ex(ZSTR_VAL(s2), ZSTR_LEN(s2), &lval2, &dval2, false, &oflow2, NULL))) { #if ZEND_ULONG_MAX == 0xFFFFFFFF if (oflow1 != 0 && oflow1 == oflow2 && dval1 - dval2 == 0. && ((oflow1 == 1 && dval1 > 9007199254740991. /*0x1FFFFFFFFFFFFF*/) @@ -3535,7 +3535,7 @@ ZEND_API int ZEND_FASTCALL zendi_smart_strcmp(const zend_string *s1, const zend_ } else { int strcmp_ret; string_cmp: - strcmp_ret = zend_binary_strcmp(s1->val, s1->len, s2->val, s2->len); + strcmp_ret = zend_binary_strcmp(ZSTR_VAL(s1), ZSTR_LEN(s1), ZSTR_VAL(s2), ZSTR_LEN(s2)); return ZEND_NORMALIZE_BOOL(strcmp_ret); } } From 49555dfa414f20ef1813496674cf3f739105cf34 Mon Sep 17 00:00:00 2001 From: Alexander Danilov Date: Tue, 10 Nov 2026 20:22:12 +0200 Subject: [PATCH 5/5] zend_test: use ZSTR_VAL() instead of direct member access --- ext/zend_test/test.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c index f3a8076a456b..b75da6cc9a21 100644 --- a/ext/zend_test/test.c +++ b/ext/zend_test/test.c @@ -2331,7 +2331,7 @@ static ZEND_METHOD(_ZendTestClass, takesUnionType) ); if (!type_matches) { zend_string *ty = zend_type_to_string(execute_data->func->internal_function.arg_info->type); - zend_argument_type_error(1, "must be of type %s, %s given", ty->val, obj->ce->name->val); + zend_argument_type_error(1, "must be of type %s, %s given", ZSTR_VAL(ty), ZSTR_VAL(obj->ce->name)); zend_string_release(ty); RETURN_THROWS(); } @@ -2392,7 +2392,7 @@ static ZEND_NAMED_FUNCTION(zend_test_internal_dnf_arguments) ); if (!type_matches) { zend_string *ty = zend_type_to_string(arginfo_zend_test_internal_dnf_arguments[1].type); - zend_argument_type_error(1, "must be of type %s, %s given", ty->val, obj->ce->name->val); + zend_argument_type_error(1, "must be of type %s, %s given", ZSTR_VAL(ty), ZSTR_VAL(obj->ce->name)); zend_string_release(ty); RETURN_THROWS(); }