On 5/14/2018 11:13 PM, Jason Gunthorpe wrote:
On Thu, May 03, 2018 at 04:36:59PM +0300, Leon Romanovsky wrote:
From: Matan Barak <matanb@xxxxxxxxxxxx>
Add validations to make sure the kernel developers used the correct
functions. We'll WARN_ON if [s]he doesn't.
Signed-off-by: Matan Barak <matanb@xxxxxxxxxxxx>
Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx>
drivers/infiniband/core/uverbs_ioctl.c | 1 +
include/rdma/uverbs_ioctl.h | 66 ++++++++++++++++++++++++++++++++++
2 files changed, 67 insertions(+)
diff --git a/drivers/infiniband/core/uverbs_ioctl.c b/drivers/infiniband/core/uverbs_ioctl.c
index 8c93970dc8f1..1b030ccbde78 100644
+++ b/drivers/infiniband/core/uverbs_ioctl.c
@@ -255,6 +255,7 @@ static int uverbs_handle_method(struct ib_uverbs_attr __user *uattr_ptr,
if (num_given_buckets <= 0)
return -EINVAL;
+ attr_bundle->method = method_spec;
attr_bundle->num_buckets = num_given_buckets;
ret = uverbs_validate_kernel_mandatory(method_spec, attr_bundle);
if (ret)
diff --git a/include/rdma/uverbs_ioctl.h b/include/rdma/uverbs_ioctl.h
index 86b3a780bbef..64b5f336cace 100644
+++ b/include/rdma/uverbs_ioctl.h
@@ -362,6 +362,7 @@ struct uverbs_attr_bundle_hash {
};
struct uverbs_attr_bundle {
+ const struct uverbs_method_spec *method;
size_t num_buckets;
struct uverbs_attr_bundle_hash hash[];
};
@@ -426,14 +427,28 @@ static inline const struct uverbs_attr *uverbs_attr_get(const struct uverbs_attr
return &attrs_bundle->hash[idx_bucket].attrs[idx & ~UVERBS_ID_NS_MASK];
}
+#define uverbs_validate_spec_debug(_method, _idx, _name, _cond) ({\
+ const struct uverbs_attr_spec *_name; \
+ \
+ _name = uverbs_get_spec(_method, idx); \
+ WARN_ON(IS_ERR(_name)) ? PTR_ERR(_name) : \
+ WARN_ON(!(_cond)) ? -EINVAL : 0; \
+})
+
static inline int uverbs_attr_get_enum_id(const struct uverbs_attr_bundle *attrs_bundle,
u16 idx)
{
const struct uverbs_attr *attr = uverbs_attr_get(attrs_bundle, idx);
+ int ret;
if (IS_ERR(attr))
return PTR_ERR(attr);
+ ret = uverbs_validate_spec_debug(attrs_bundle->method, idx, spec,
+ spec->type == UVERBS_ATTR_TYPE_ENUM_IN);
+ if (ret)
+ return ret;
I prefer to do most of this validation at time... In any event it has
no linkage to this series so lets drop it (and related) on the v2..
OK, this patch and other related validation parts will be dropped in V1.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html