[ovs-discuss] Kernel Crash with linux 3.18.29 + ovs 2.6.0 when received malformed or RCOed VXLAN packet.

Pravin Shelar pshelar at ovn.org
Fri Nov 11 16:06:54 UTC 2016


On Thu, Nov 10, 2016 at 7:15 PM, 张东亚 <fortitude.zhang at gmail.com> wrote:
> Hi,
>
> We are now evaluating ovs 2.6.0 and found some kernel crash, after review
> the code ,it seems in vxlan_gro_receive in compat code, with 3.18.29 kernel,
> the following PSed code will trigger NULL dereference, which make kernel
> crashed.
>
> I have also checked the code of ovs 2.5.0, it does not have the same issue
> because it will check 'vs' variable and then check the remote csum receive
> flag.
>
Thanks for bug report and analysis. Can you send patch that does
similar check on 2.6 and master?

> This seems introduced by commit f2252c6105a32bada26949fa65ec146c4ac30697
> which try to sync compat vxlan and geneve with upstream kernel.
>
> The code that trigger the crash:
>
> #ifndef HAVE_UDP_OFFLOAD_ARG_UOFF
> static struct sk_buff **vxlan_gro_receive(struct sk_buff **head,
>                                           struct sk_buff *skb)
> #else
> static struct sk_buff **vxlan_gro_receive(struct sk_buff **head,
>                                           struct sk_buff *skb,
>                                           struct udp_offload *uoff)
> #endif
> {
> #ifdef HAVE_UDP_OFFLOAD_ARG_UOFF
>         struct vxlan_sock *vs = container_of(uoff, struct vxlan_sock,
>                         udp_offloads);
> #else
>         struct vxlan_sock *vs = NULL;
> #endif
>         struct sk_buff *p, **pp = NULL;
>         struct vxlanhdr *vh, *vh2;
>         unsigned int hlen, off_vx;
>         int flush = 1;
>         __be32 flags;
>         struct gro_remcsum grc;
>
>         skb_gro_remcsum_init(&grc);
>
>         off_vx = skb_gro_offset(skb);
>         hlen = off_vx + sizeof(*vh);
>         vh   = skb_gro_header_fast(skb, off_vx);
>         if (skb_gro_header_hard(skb, hlen)) {
>                 vh = skb_gro_header_slow(skb, hlen, off_vx);
>                 if (unlikely(!vh))
>                         goto out;
>         }
>
>         skb_gro_postpull_rcsum(skb, vh, sizeof(struct vxlanhdr));
>
>         flags = vh->vx_flags;
>
>         if ((flags & VXLAN_HF_RCO) && (vs->flags & VXLAN_F_REMCSUM_RX)) { //
> vs is NULL!
>                 vh = vxlan_gro_remcsum(skb, off_vx, vh, sizeof(struct
> vxlanhdr),
>                                        vh->vx_vni, &grc,
>                                        !!(vs->flags &
>                                           VXLAN_F_REMCSUM_NOPARTIAL));
>
>
> _______________________________________________
> discuss mailing list
> discuss at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-discuss
>


More information about the discuss mailing list