]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
xfrm: Fix infinite loop in xfrm_get_dst_nexthop with transport mode.
authorSteffen Klassert <steffen.klassert@secunet.com>
Mon, 19 Feb 2018 06:44:07 +0000 (07:44 +0100)
committerSteffen Klassert <steffen.klassert@secunet.com>
Tue, 20 Feb 2018 07:38:57 +0000 (08:38 +0100)
On transport mode we forget to fetch the child dst_entry
before we continue the while loop, this leads to an infinite
loop. Fix this by fetching the child dst_entry before we
continue the while loop.

Fixes: 0f6c480f23f4 ("xfrm: Move dst->path into struct xfrm_dst")
Reported-by: syzbot+7d03c810e50aaedef98a@syzkaller.appspotmail.com
Tested-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
net/xfrm/xfrm_policy.c

index 150d46633ce6f2b7b75bc44253e4b53338c52686..625b3fca570419455656021b61bf132fb08e8b2a 100644 (file)
@@ -2732,14 +2732,14 @@ static const void *xfrm_get_dst_nexthop(const struct dst_entry *dst,
        while (dst->xfrm) {
                const struct xfrm_state *xfrm = dst->xfrm;
 
+               dst = xfrm_dst_child(dst);
+
                if (xfrm->props.mode == XFRM_MODE_TRANSPORT)
                        continue;
                if (xfrm->type->flags & XFRM_TYPE_REMOTE_COADDR)
                        daddr = xfrm->coaddr;
                else if (!(xfrm->type->flags & XFRM_TYPE_LOCAL_COADDR))
                        daddr = &xfrm->id.daddr;
-
-               dst = xfrm_dst_child(dst);
        }
        return daddr;
 }