struct ib_flow_action *action;
        size_t num_actions;
        void *in;
-       int len;
        int ret;
 
        if (!mlx5_ib_modify_header_supported(mdev))
 
        in = uverbs_attr_get_alloced_ptr(attrs,
                MLX5_IB_ATTR_CREATE_MODIFY_HEADER_ACTIONS_PRM);
-       len = uverbs_attr_get_len(attrs,
-               MLX5_IB_ATTR_CREATE_MODIFY_HEADER_ACTIONS_PRM);
 
-       if (len % MLX5_UN_SZ_BYTES(set_action_in_add_action_in_auto))
-               return -EINVAL;
+       num_actions = uverbs_attr_ptr_get_array_size(
+               attrs, MLX5_IB_ATTR_CREATE_MODIFY_HEADER_ACTIONS_PRM,
+               MLX5_UN_SZ_BYTES(set_action_in_add_action_in_auto));
+       if (num_actions < 0)
+               return num_actions;
 
        ret = uverbs_get_const(&ft_type, attrs,
                               MLX5_IB_ATTR_CREATE_MODIFY_HEADER_FT_TYPE);
        if (ret)
                return ret;
-
-       num_actions = len / MLX5_UN_SZ_BYTES(set_action_in_add_action_in_auto),
        action = mlx5_ib_create_modify_header(mdev, ft_type, num_actions, in);
        if (IS_ERR(action))
                return PTR_ERR(action);
 
        return attr->ptr_attr.len;
 }
 
+/*
+ * uverbs_attr_ptr_get_array_size() - Get array size pointer by a ptr
+ * attribute.
+ * @attrs: The attribute bundle
+ * @idx: The ID of the attribute
+ * @elem_size: The size of the element in the array
+ */
+static inline int
+uverbs_attr_ptr_get_array_size(struct uverbs_attr_bundle *attrs, u16 idx,
+                              size_t elem_size)
+{
+       int size = uverbs_attr_get_len(attrs, idx);
+
+       if (size < 0)
+               return size;
+
+       if (size % elem_size)
+               return -EINVAL;
+
+       return size / elem_size;
+}
+
 /**
  * uverbs_attr_get_uobjs_arr() - Provides array's properties for attribute for
  * UVERBS_ATTR_TYPE_IDRS_ARRAY.