]> git.baikalelectronics.ru Git - kernel.git/commit
sctp: hold transport instead of assoc when lookup assoc in rx path
authorXin Long <lucien.xin@gmail.com>
Mon, 31 Oct 2016 12:32:33 +0000 (20:32 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 31 Oct 2016 20:20:33 +0000 (16:20 -0400)
commit25b0c2cb1c060a61725b6b8ea37ebf1d955d4fdd
tree5ea1f8d710959c462452efaa4fffc8d7d1f0cbb7
parent69215bbd30fc9e6ec22f213ba7c4600e210aa261
sctp: hold transport instead of assoc when lookup assoc in rx path

Prior to this patch, in rx path, before calling lock_sock, it needed to
hold assoc when got it by __sctp_lookup_association, in case other place
would free/put assoc.

But in __sctp_lookup_association, it lookup and hold transport, then got
assoc by transport->assoc, then hold assoc and put transport. It means
it didn't hold transport, yet it was returned and later on directly
assigned to chunk->transport.

Without the protection of sock lock, the transport may be freed/put by
other places, which would cause a use-after-free issue.

This patch is to fix this issue by holding transport instead of assoc.
As holding transport can make sure to access assoc is also safe, and
actually it looks up assoc by searching transport rhashtable, to hold
transport here makes more sense.

Note that the function will be renamed later on on another patch.

Signed-off-by: Xin Long <lucien.xin@gmail.com>
Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sctp/sctp.h
net/sctp/input.c
net/sctp/ipv6.c