Skip to content

Commit 04667a6

Browse files
committed
Change zend_ast_kind and zend_ast_attr from uint16_t to uint32_t
The zend_ast_attr type was defined as uint16_t, limiting it to 16 bits, but it's used to store ZEND_ACC_* flags which can use bits up to 31: - ZEND_ACC_OVERRIDE = (1 << 28) - ZEND_ACC_ENUM = (1 << 28) - ZEND_ACC_STRICT_TYPES = (1U << 31) While current code doesn't appear to assign these high-bit flags to ast->attr fields, the type mismatch creates a potential bug where any future code attempting to store ZEND_ACC flags with bits 16-31 would have those bits silently truncated to zero. Additionally, several functions (zend_ast_create_va, zend_ast_create_ex_*, etc.) accept uint32_t or zend_ast_attr parameters before assigning to the attr field, creating a truncation point at line 821 in zend_language_parser.y where zend_modifier_list_to_flags() returns uint32_t. This change: 1. Changes zend_ast_kind typedef from uint16_t to uint32_t 2. Changes zend_ast_attr typedef from uint16_t to uint32_t Extending kind to uint32_t maintains natural alignment without requiring explicit padding fields. The structure sizes remain unchanged. Padding was already present implicitly due to alignment.
1 parent 035f95c commit 04667a6

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

Zend/zend_ast.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,8 @@ enum _zend_ast_kind {
182182
ZEND_AST_PARAM = 6 << ZEND_AST_NUM_CHILDREN_SHIFT,
183183
};
184184

185-
typedef uint16_t zend_ast_kind;
186-
typedef uint16_t zend_ast_attr;
185+
typedef uint32_t zend_ast_kind;
186+
typedef uint32_t zend_ast_attr;
187187

188188
struct _zend_ast {
189189
zend_ast_kind kind; /* Type of the node (ZEND_AST_* enum constant) */

0 commit comments

Comments
 (0)