This fixes a regression where valid selectors are incorrectly skipped when xfrm_state_find is called with a non-matching address family (e.g. when using IPv6-in-IPv4 ESP in transport mode).
The state's address family is matched against the template's family (encap_family) in xfrm_state_find before checking the selector in xfrm_state_look_at. The template's family should also be used for selector matching, otherwise valid selectors may be skipped. Fixes: e94ee171349d ("xfrm: Use correct address family in xfrm_state_find") Signed-off-by: Anthony DeRossi <ajdero...@gmail.com> --- net/xfrm/xfrm_state.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index ee6ac32bb06d..065f1bd8479a 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -1075,7 +1075,7 @@ xfrm_state_find(const xfrm_address_t *daddr, const xfrm_address_t *saddr, tmpl->mode == x->props.mode && tmpl->id.proto == x->id.proto && (tmpl->id.spi == x->id.spi || !tmpl->id.spi)) - xfrm_state_look_at(pol, x, fl, family, + xfrm_state_look_at(pol, x, fl, encap_family, &best, &acquire_in_progress, &error); } if (best || acquire_in_progress) @@ -1092,7 +1092,7 @@ xfrm_state_find(const xfrm_address_t *daddr, const xfrm_address_t *saddr, tmpl->mode == x->props.mode && tmpl->id.proto == x->id.proto && (tmpl->id.spi == x->id.spi || !tmpl->id.spi)) - xfrm_state_look_at(pol, x, fl, family, + xfrm_state_look_at(pol, x, fl, encap_family, &best, &acquire_in_progress, &error); } -- 2.26.2