diff options
| author | Steffen Klassert <steffen.klassert@secunet.com> | 2018-02-19 07:44:07 +0100 | 
|---|---|---|
| committer | Steffen Klassert <steffen.klassert@secunet.com> | 2018-02-20 08:38:57 +0100 | 
| commit | 013cb81e89f8a70deef086ca29a923faf5585ab0 (patch) | |
| tree | a464f9903eef9b342c093857b655e0df297ef08c | |
| parent | 143a4454daaf0e80a2b9f37159a0d6d2b61e64ed (diff) | |
xfrm: Fix infinite loop in xfrm_get_dst_nexthop with transport mode.
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>
| -rw-r--r-- | net/xfrm/xfrm_policy.c | 4 | 
1 files changed, 2 insertions, 2 deletions
| diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 150d46633ce6..625b3fca5704 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -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;  } | 
