From: Matan Barak <matanb@xxxxxxxxxxxx> Adding uverbs_copy_from_and_alloc which allocates and copies enough space to copy the user-space attribute. This function could return a PTR_ERR. The user is required to free the memory by using kfree(). The length of the allocated space could be queried by using uverbs_attr_get_len. Signed-off-by: Matan Barak <matanb@xxxxxxxxxxxx> Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> --- include/rdma/uverbs_ioctl.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/include/rdma/uverbs_ioctl.h b/include/rdma/uverbs_ioctl.h index 9aa05bfc89b7..24689f3fe454 100644 --- a/include/rdma/uverbs_ioctl.h +++ b/include/rdma/uverbs_ioctl.h @@ -650,6 +650,38 @@ static inline int _uverbs_copy_from_or_zero(void *to, return 0; } +static inline void *uverbs_copy_from_and_alloc(const struct uverbs_attr_bundle *attrs_bundle, + size_t idx, gfp_t flags) +{ + int len = uverbs_attr_get_len(attrs_bundle, idx); + void *to; + int ret; + + if (len < 0) + return ERR_PTR(len); + + /* It doesn't make any sense to re-allocate and copy if it was already + * done by the parser. + */ + ret = uverbs_validate_actual_spec_debug(attrs_bundle, idx, spec, + spec->type == UVERBS_ATTR_TYPE_PTR_IN && + spec->flags & ~UVERBS_ATTR_SPEC_F_ALLOC_AND_COPY); + if (ret) + return ERR_PTR(ret); + + to = kmalloc(len, flags); + if (!to) + return ERR_PTR(-ENOMEM); + + ret = _uverbs_copy_from(to, attrs_bundle, idx, len); + if (ret) { + kfree(to); + return ERR_PTR(ret); + } + + return to; +} + #define uverbs_copy_from(to, attrs_bundle, idx) \ _uverbs_copy_from(to, attrs_bundle, idx, sizeof(*to)) -- 2.14.3 -- 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