sctp: move the active_key update after sh_keys is added
[ Upstream commit ae954bbc451d267f7d60d7b49db811d5a68ebd7b ] In commit 58acd1009226 ("sctp: update active_key for asoc when old key is being replaced"), sctp_auth_asoc_init_active_key() is called to update the active_key right after the old key is deleted and before the new key is added, and it caused that the active_key could be found with the key_id. In Ying Xu's testing, the BUG_ON in sctp_auth_asoc_init_active_key() was triggered: [ ] kernel BUG at net/sctp/auth.c:416! [ ] RIP: 0010:sctp_auth_asoc_init_active_key.part.8+0xe7/0xf0 [sctp] [ ] Call Trace: [ ] sctp_auth_set_key+0x16d/0x1b0 [sctp] [ ] sctp_setsockopt.part.33+0x1ba9/0x2bd0 [sctp] [ ] __sys_setsockopt+0xd6/0x1d0 [ ] __x64_sys_setsockopt+0x20/0x30 [ ] do_syscall_64+0x5b/0x1a0 So fix it by moving the active_key update after sh_keys is added. Fixes: 58acd1009226 ("sctp: update active_key for asoc when old key is being replaced") Reported-by: Ying Xu <yinxu@redhat.com> Signed-off-by: Xin Long <lucien.xin@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
de30346dd3
commit
d333503de1
@ -863,14 +863,18 @@ int sctp_auth_set_key(struct sctp_endpoint *ep,
|
|||||||
memcpy(key->data, &auth_key->sca_key[0], auth_key->sca_keylength);
|
memcpy(key->data, &auth_key->sca_key[0], auth_key->sca_keylength);
|
||||||
cur_key->key = key;
|
cur_key->key = key;
|
||||||
|
|
||||||
if (replace) {
|
if (!replace) {
|
||||||
list_del_init(&shkey->key_list);
|
list_add(&cur_key->key_list, sh_keys);
|
||||||
sctp_auth_shkey_release(shkey);
|
return 0;
|
||||||
if (asoc && asoc->active_key_id == auth_key->sca_keynumber)
|
|
||||||
sctp_auth_asoc_init_active_key(asoc, GFP_KERNEL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list_del_init(&shkey->key_list);
|
||||||
|
sctp_auth_shkey_release(shkey);
|
||||||
list_add(&cur_key->key_list, sh_keys);
|
list_add(&cur_key->key_list, sh_keys);
|
||||||
|
|
||||||
|
if (asoc && asoc->active_key_id == auth_key->sca_keynumber)
|
||||||
|
sctp_auth_asoc_init_active_key(asoc, GFP_KERNEL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user