mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 22:54:05 +08:00
sctp: call rcu_read_lock before checking for duplicate transport nodes
Commitcd2b708750
("sctp: check duplicate node before inserting a new transport") called rhltable_lookup() to check for the duplicate transport node in transport rhashtable. But rhltable_lookup() doesn't call rcu_read_lock inside, it could cause a use-after-free issue if it tries to dereference the node that another cpu has freed it. Note that sock lock can not avoid this as it is per sock. This patch is to fix it by calling rcu_read_lock before checking for duplicate transport nodes. Fixes:cd2b708750
("sctp: check duplicate node before inserting a new transport") Reported-by: Andrey Konovalov <andreyknvl@google.com> Signed-off-by: Xin Long <lucien.xin@gmail.com> Acked-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
540b1c48c3
commit
5179b26694
@ -884,14 +884,17 @@ int sctp_hash_transport(struct sctp_transport *t)
|
||||
arg.paddr = &t->ipaddr;
|
||||
arg.lport = htons(t->asoc->base.bind_addr.port);
|
||||
|
||||
rcu_read_lock();
|
||||
list = rhltable_lookup(&sctp_transport_hashtable, &arg,
|
||||
sctp_hash_params);
|
||||
|
||||
rhl_for_each_entry_rcu(transport, tmp, list, node)
|
||||
if (transport->asoc->ep == t->asoc->ep) {
|
||||
rcu_read_unlock();
|
||||
err = -EEXIST;
|
||||
goto out;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
err = rhltable_insert_key(&sctp_transport_hashtable, &arg,
|
||||
&t->node, sctp_hash_params);
|
||||
|
Loading…
Reference in New Issue
Block a user