Convert infiniband uverbs to struct_size
authorMatthew Wilcox <mawilcox@microsoft.com>
Thu, 7 Jun 2018 14:57:16 +0000 (07:57 -0700)
committerKees Cook <keescook@chromium.org>
Tue, 12 Jun 2018 23:19:22 +0000 (16:19 -0700)
The flows were hidden from the C compiler; expose them as a zero-length
array to allow struct_size to work.

Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
drivers/infiniband/core/uverbs_cmd.c
include/rdma/ib_verbs.h

index 3179a95..3e90b6a 100644 (file)
@@ -3559,8 +3559,8 @@ int ib_uverbs_ex_create_flow(struct ib_uverbs_file *file,
                goto err_uobj;
        }
 
-       flow_attr = kzalloc(sizeof(*flow_attr) + cmd.flow_attr.num_of_specs *
-                           sizeof(union ib_flow_spec), GFP_KERNEL);
+       flow_attr = kzalloc(struct_size(flow_attr, flows,
+                               cmd.flow_attr.num_of_specs), GFP_KERNEL);
        if (!flow_attr) {
                err = -ENOMEM;
                goto err_put;
index 2043e1a..4c6241b 100644 (file)
@@ -2093,10 +2093,7 @@ struct ib_flow_attr {
        u32          flags;
        u8           num_of_specs;
        u8           port;
-       /* Following are the optional layers according to user request
-        * struct ib_flow_spec_xxx
-        * struct ib_flow_spec_yyy
-        */
+       union ib_flow_spec flows[];
 };
 
 struct ib_flow {