Commit 06e27c9a authored by Xin Long's avatar Xin Long Committed by Yang Yingliang
Browse files

sctp: move the active_key update after sh_keys is added



stable inclusion
from linux-4.19.203
commit f91e7bd934c705f25dc6651e29e9c857d48a51f4

--------------------------------

[ Upstream commit ae954bbc ]

In commit 58acd100 ("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: 58acd100 ("sctp: update active_key for asoc when old key is being replaced")
Reported-by: default avatarYing Xu <yinxu@redhat.com>
Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
Reviewed-by: default avatarYue Haibing <yuehaibing@huawei.com>
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
parent 13608ed4
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -880,13 +880,17 @@ int sctp_auth_set_key(struct sctp_endpoint *ep,
	memcpy(key->data, &auth_key->sca_key[0], auth_key->sca_keylength);
	cur_key->key = key;

	if (replace) {
	if (!replace) {
		list_add(&cur_key->key_list, sh_keys);
		return 0;
	}

	list_del_init(&shkey->key_list);
	sctp_auth_shkey_release(shkey);
	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);
	}
	list_add(&cur_key->key_list, sh_keys);

	return 0;
}