On Fri, Aug 17, 2018 at 1:15 AM Jiecheng Wu <jasonwood2...@gmail.com> wrote:
>
> Function queue_userspace_packet() defined in net/openvswitch/datapath.c calls 
> nla_nest_start() to allocate memory for struct nlattr which is dereferenced 
> immediately. As nla_nest_start() may return NULL on failure, this code piece 
> may cause NULL pointer dereference bug.
> ---
>  net/openvswitch/datapath.c | 4 ++++
>  1 file changed, 4 insertions(+)
>
> diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c
> index 0f5ce77..ff4457d 100644
> --- a/net/openvswitch/datapath.c
> +++ b/net/openvswitch/datapath.c
> @@ -460,6 +460,8 @@ static int queue_userspace_packet(struct datapath *dp, 
> struct sk_buff *skb,
>
>         if (upcall_info->egress_tun_info) {
>                 nla = nla_nest_start(user_skb, 
> OVS_PACKET_ATTR_EGRESS_TUN_KEY);
> +               if (!nla)
> +                       return -EMSGSIZE;
It is not possible, since user_skb is allocated to accommodate all
netlink attributes.

>                 err = ovs_nla_put_tunnel_info(user_skb,
>                                               upcall_info->egress_tun_info);
>                 BUG_ON(err);
> @@ -468,6 +470,8 @@ static int queue_userspace_packet(struct datapath *dp, 
> struct sk_buff *skb,
>
>         if (upcall_info->actions_len) {
>                 nla = nla_nest_start(user_skb, OVS_PACKET_ATTR_ACTIONS);
> +               if (!nla)
> +                       return -EMSGSIZE;
same as above, the check is not required.

>                 err = ovs_nla_put_actions(upcall_info->actions,
>                                           upcall_info->actions_len,
>                                           user_skb);
> --
> 2.6.4
>

Reply via email to