Skip to content

Commit 6bf2daa

Browse files
qsngregkh
authored andcommitted
xfrm: state: initialize state_ptrs earlier in xfrm_state_find
[ Upstream commit 94d077c ] In case of preemption, xfrm_state_look_at will find a different pcpu_id and look up states for that other CPU. If we matched a state for CPU2 in the state_cache while the lookup started on CPU1, we will jump to "found", but the "best" state that we got will be ignored and we will enter the "acquire" block. This block uses state_ptrs, which isn't initialized at this point. Let's initialize state_ptrs just after taking rcu_read_lock. This will also prevent a possible misuse in the future, if someone adjusts this function. Reported-by: syzbot+7ed9d47e15e88581dc5b@syzkaller.appspotmail.com Fixes: e952837 ("xfrm: state: fix out-of-bounds read during lookup") Signed-off-by: Sabrina Dubroca <sd@queasysnail.net> Reviewed-by: Florian Westphal <fw@strlen.de> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 80d66be commit 6bf2daa

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

net/xfrm/xfrm_state.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1324,6 +1324,8 @@ xfrm_state_find(const xfrm_address_t *daddr, const xfrm_address_t *saddr,
13241324
sequence = read_seqcount_begin(&net->xfrm.xfrm_state_hash_generation);
13251325

13261326
rcu_read_lock();
1327+
xfrm_hash_ptrs_get(net, &state_ptrs);
1328+
13271329
hlist_for_each_entry_rcu(x, &pol->state_cache_list, state_cache) {
13281330
if (x->props.family == encap_family &&
13291331
x->props.reqid == tmpl->reqid &&
@@ -1364,8 +1366,6 @@ xfrm_state_find(const xfrm_address_t *daddr, const xfrm_address_t *saddr,
13641366
else if (acquire_in_progress) /* XXX: acquire_in_progress should not happen */
13651367
WARN_ON(1);
13661368

1367-
xfrm_hash_ptrs_get(net, &state_ptrs);
1368-
13691369
h = __xfrm_dst_hash(daddr, saddr, tmpl->reqid, encap_family, state_ptrs.hmask);
13701370
hlist_for_each_entry_rcu(x, state_ptrs.bydst + h, bydst) {
13711371
#ifdef CONFIG_XFRM_OFFLOAD

0 commit comments

Comments
 (0)