On 28/8/2013 7:21 PM, Jason Gunthorpe wrote:
On Wed, Aug 28, 2013 at 03:47:54PM +0300, Matan Barak wrote:
+
+       if (cmd.comp_mask)
+               return -EINVAL;

So, how do you propose to interoperate with new user space/old
kernels?

How will user space know what comp_mask values the kernel will
support?


struct ib_uverbs_create_flow_resp contains a comp_mask value. This value
should contain the supported comp_masks fields.
Currently, we don't support any extensions, so we zero this field by doing "memset(&resp, 0, sizeof(resp));"

I suggest returning an error and setting the response comp_mask field.

The notion that was established in the verbs patches is that extra
structure fields are ignored by old software.

I'm not aware of any such concrete example. Could you please point out ?
I think it's safer to return an error. Imagine that ibv_modify_qp was extended for some crucial field, say IB_QP_AV2. Creating a QP without indicating its AV (or AV2 in that case) is an invalid behavior. This example is a bit artificial, though some future extensions could have such mandatory fields. The user should do ibv_query_device before requesting features that might be unsupported.

+       if ((cmd.flow_attr.type == IB_FLOW_ATTR_SNIFFER &&
+            !capable(CAP_NET_ADMIN)) || !capable(CAP_NET_RAW))
+               return -EPERM;
+
+       if (cmd.flow_attr.num_of_specs < 0 ||
+           cmd.flow_attr.num_of_specs > IB_FLOW_SPEC_SUPPORT_LAYERS)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > checked here
+               return -EINVAL;
+
+       kern_attr_size = cmd.flow_attr.size - sizeof(cmd) -
+                        sizeof(struct ib_uverbs_cmd_hdr_ex);
+
+       if (cmd.flow_attr.size < 0 || cmd.flow_attr.size > in_len ||
+           kern_attr_size < 0 || kern_attr_size >
+           (cmd.flow_attr.num_of_specs * sizeof(struct ib_kern_spec)))
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Watch out for integer overflow here..
I don't think there's a risk of integer overflow since sizeof(struct ib_kern_spec) is a constant of ~50 bytes long and cmd.flow_attr.num_of_specs is checked above and is at most 4.

Jason


Since the code was already merged, I'll post an incremental patch and I suggest that we'll continue things there.

- Matan

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to