net: xfrm: don't double-hold dst when sk_policy in use.
authorLorenzo Colitti <lorenzo@google.com>
Wed, 23 Aug 2017 08:14:39 +0000 (17:14 +0900)
committerSteffen Klassert <steffen.klassert@secunet.com>
Thu, 24 Aug 2017 11:01:14 +0000 (13:01 +0200)
commit8a4b5784fac2af93ad6a8c08fb56d021e0c0416b
tree43edc44a531d6665bda28b4a86855ea863ddc541
parent2b33bc8aa236b75d6e86a8a79126fd9739e4a5bd
net: xfrm: don't double-hold dst when sk_policy in use.

While removing dst_entry garbage collection, commit 52df157f17e5
("xfrm: take refcnt of dst when creating struct xfrm_dst bundle")
changed xfrm_resolve_and_create_bundle so it returns an xdst with
a refcount of 1 instead of 0.

However, it did not delete the dst_hold performed by xfrm_lookup
when a per-socket policy is in use. This means that when a
socket policy is in use, dst entries returned by xfrm_lookup have
a refcount of 2, and are not freed when no longer in use.

Cc: Wei Wang <weiwan@google.com>
Fixes: 52df157f17 ("xfrm: take refcnt of dst when creating struct xfrm_dst bundle")
Tested: https://android-review.googlesource.com/417481
Tested: https://android-review.googlesource.com/418659
Tested: https://android-review.googlesource.com/424463
Tested: https://android-review.googlesource.com/452776 passes on net-next
Signed-off-by: Lorenzo Colitti <lorenzo@google.com>
Acked-by: Wei Wang <weiwan@google.com>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
net/xfrm/xfrm_policy.c