Skip to content

Commit d216c35

Browse files
committed
Make name qualifying checks safe
1 parent c3efd97 commit d216c35

File tree

3 files changed

+17
-14
lines changed

3 files changed

+17
-14
lines changed

Zend/zend_ast.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -1394,9 +1394,9 @@ static ZEND_COLD void zend_ast_export_ns_name(smart_str *str, zend_ast *ast, int
13941394
zval *zv = zend_ast_get_zval(ast);
13951395

13961396
if (Z_TYPE_P(zv) == IS_STRING) {
1397-
if (ast->attr == ZEND_NAME_FQ) {
1397+
if (NAME_QUAL(ast->attr) == ZEND_NAME_FQ) {
13981398
smart_str_appendc(str, '\\');
1399-
} else if (ast->attr == ZEND_NAME_RELATIVE) {
1399+
} else if (NAME_QUAL(ast->attr) == ZEND_NAME_RELATIVE) {
14001400
smart_str_appends(str, "namespace\\");
14011401
}
14021402
smart_str_append(str, Z_STR_P(zv));

Zend/zend_compile.c

+13-12
Original file line numberDiff line numberDiff line change
@@ -1080,12 +1080,12 @@ static zend_string *zend_resolve_non_class_name(
10801080
return zend_string_init(ZSTR_VAL(name) + 1, ZSTR_LEN(name) - 1, 0);
10811081
}
10821082

1083-
if (type == ZEND_NAME_FQ) {
1083+
if (NAME_QUAL(type) == ZEND_NAME_FQ) {
10841084
*is_fully_qualified = 1;
10851085
return zend_string_copy(name);
10861086
}
10871087

1088-
if (type == ZEND_NAME_RELATIVE) {
1088+
if (NAME_QUAL(type) == ZEND_NAME_RELATIVE) {
10891089
*is_fully_qualified = 1;
10901090
return zend_prefix_with_ns(name);
10911091
}
@@ -1142,23 +1142,24 @@ static zend_string *zend_resolve_class_name(zend_string *name, uint32_t type) /*
11421142
char *compound;
11431143

11441144
if (ZEND_FETCH_CLASS_DEFAULT != zend_get_class_fetch_type(name)) {
1145-
if (type == ZEND_NAME_FQ) {
1145+
if (NAME_QUAL(type) == ZEND_NAME_FQ) {
11461146
zend_error_noreturn(E_COMPILE_ERROR,
11471147
"'\\%s' is an invalid class name", ZSTR_VAL(name));
11481148
}
1149-
if (type == ZEND_NAME_RELATIVE) {
1149+
if (NAME_QUAL(type) == ZEND_NAME_RELATIVE) {
11501150
zend_error_noreturn(E_COMPILE_ERROR,
11511151
"'namespace\\%s' is an invalid class name", ZSTR_VAL(name));
11521152
}
1153-
ZEND_ASSERT(type == ZEND_NAME_NOT_FQ);
1153+
1154+
ZEND_ASSERT(NAME_QUAL(type) == ZEND_NAME_NOT_FQ);
11541155
return zend_string_copy(name);
11551156
}
11561157

1157-
if (type == ZEND_NAME_RELATIVE) {
1158+
if (NAME_QUAL(type) == ZEND_NAME_RELATIVE) {
11581159
return zend_prefix_with_ns(name);
11591160
}
11601161

1161-
if (type == ZEND_NAME_FQ) {
1162+
if (NAME_QUAL(type) == ZEND_NAME_FQ) {
11621163
if (ZSTR_VAL(name)[0] == '\\') {
11631164
/* Remove \ prefix (only relevant if this is a string rather than a label) */
11641165
name = zend_string_init(ZSTR_VAL(name) + 1, ZSTR_LEN(name) - 1, 0);
@@ -1745,7 +1746,7 @@ uint32_t zend_get_class_fetch_type(const zend_string *name) /* {{{ */
17451746
static uint32_t zend_get_class_fetch_type_ast(zend_ast *name_ast) /* {{{ */
17461747
{
17471748
/* Fully qualified names are always default refs */
1748-
if (name_ast->attr == ZEND_NAME_FQ) {
1749+
if (NAME_QUAL(name_ast->attr) == ZEND_NAME_FQ) {
17491750
return ZEND_FETCH_CLASS_DEFAULT;
17501751
}
17511752

@@ -2874,7 +2875,7 @@ static void zend_compile_class_ref(znode *result, zend_ast *name_ast, uint32_t f
28742875
}
28752876

28762877
/* Fully qualified names are always default refs */
2877-
if (name_ast->attr == ZEND_NAME_FQ) {
2878+
if (NAME_QUAL(name_ast->attr) == ZEND_NAME_FQ) {
28782879
result->op_type = IS_CONST;
28792880
ZVAL_STR(&result->u.constant, zend_resolve_class_name_ast(name_ast));
28802881
return;
@@ -6960,7 +6961,7 @@ static zend_type zend_compile_single_typename(zend_ast *ast)
69606961
uint8_t type_code = zend_lookup_builtin_type_by_name(type_name);
69616962

69626963
if (type_code != 0) {
6963-
if ((ast->attr & ZEND_NAME_NOT_FQ) != ZEND_NAME_NOT_FQ) {
6964+
if (NAME_QUAL(ast->attr) != ZEND_NAME_NOT_FQ) {
69646965
zend_error_noreturn(E_COMPILE_ERROR,
69656966
"Type declaration '%s' must be unqualified",
69666967
ZSTR_VAL(zend_string_tolower(type_name)));
@@ -7004,7 +7005,7 @@ static zend_type zend_compile_single_typename(zend_ast *ast)
70047005
zend_string_addref(class_name);
70057006
}
70067007

7007-
if (ast->attr == ZEND_NAME_NOT_FQ
7008+
if (NAME_QUAL(ast->attr) == ZEND_NAME_NOT_FQ
70087009
&& zend_is_confusable_type(type_name, &correct_name)
70097010
&& zend_is_not_imported(type_name)) {
70107011
const char *extra =
@@ -10790,7 +10791,7 @@ static void zend_compile_const(znode *result, zend_ast *ast) /* {{{ */
1079010791
zend_string *orig_name = zend_ast_get_str(name_ast);
1079110792
zend_string *resolved_name = zend_resolve_const_name(orig_name, name_ast->attr, &is_fully_qualified);
1079210793

10793-
if (zend_string_equals_literal(resolved_name, "__COMPILER_HALT_OFFSET__") || (name_ast->attr != ZEND_NAME_RELATIVE && zend_string_equals_literal(orig_name, "__COMPILER_HALT_OFFSET__"))) {
10794+
if (zend_string_equals_literal(resolved_name, "__COMPILER_HALT_OFFSET__") || (NAME_QUAL(name_ast->attr) != ZEND_NAME_RELATIVE && zend_string_equals_literal(orig_name, "__COMPILER_HALT_OFFSET__"))) {
1079410795
zend_ast *last = CG(ast);
1079510796

1079610797
while (last && last->kind == ZEND_AST_STMT_LIST) {

Zend/zend_compile.h

+2
Original file line numberDiff line numberDiff line change
@@ -1034,6 +1034,8 @@ ZEND_API zend_string *zend_type_to_string(zend_type type);
10341034
#define ZEND_NAME_FQ 0
10351035
#define ZEND_NAME_NOT_FQ 1
10361036
#define ZEND_NAME_RELATIVE 2
1037+
#define ZEND_NAME_QUALIFIED_MASK 0x0011
1038+
#define NAME_QUAL(type) (type & ZEND_NAME_QUALIFIED_MASK)
10371039

10381040
#define ZEND_NAME_OPTIONAL 4
10391041

0 commit comments

Comments
 (0)