On 5/9/24 16:13, Eduard Zingerman wrote:
On Tue, 2024-05-07 at 23:32 -0700, Kui-Feng Lee wrote:
The verifier uses field information for certain special types, such as
kptr, rbtree root, and list head. These types are treated
differently. However, we did not previously support these types in
arrays. This update examines arrays and duplicates field information the
same number of times as the length of the array if the element type is one
of the special types.
Signed-off-by: Kui-Feng Lee <thinker.li@xxxxxxxxx>
---
Acked-by: Eduard Zingerman <eddyz87@xxxxxxxxx>
[...]
@@ -3504,6 +3539,19 @@ static int btf_find_field_one(const struct btf *btf,
{
int ret, align, sz, field_type;
struct btf_field_info tmp;
+ const struct btf_array *array;
+ u32 i, nelems = 1;
+
+ /* Walk into array types to find the element type and the number of
+ * elements in the (flattened) array.
+ */
+ for (i = 0; i < MAX_RESOLVE_DEPTH && btf_type_is_array(var_type); i++) {
+ array = btf_array(var_type);
+ nelems *= array->nelems;
+ var_type = btf_type_by_id(btf, array->type);
+ }
Nit: still think that error should be reported when i == MAX_RESOLVE_DEPTH.
Sure! I will change it.
+ if (nelems == 0)
+ return 0;
field_type = btf_get_field_type(__btf_name_by_offset(btf, var_type->name_off),
field_mask, seen_mask, &align, &sz);
[...]