]> git.baikalelectronics.ru Git - kernel.git/commit
sctp: fix an use-after-free issue in sctp_sock_dump
authorXin Long <lucien.xin@gmail.com>
Fri, 15 Sep 2017 03:02:21 +0000 (11:02 +0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 15 Sep 2017 21:47:49 +0000 (14:47 -0700)
commit6a6f6f6c160d4d77858f7a10e1c84f33fe4c727c
treef837b2ada6d0f4c23319a8950fa8dff821e07b72
parentaaf700bb1577dfe0065ca3cbaa0a6ddb36b312cd
sctp: fix an use-after-free issue in sctp_sock_dump

Commit 2959b44e60ae ("sctp: ensure ep is not destroyed before doing the
dump") tried to fix an use-after-free issue by checking !sctp_sk(sk)->ep
with holding sock and sock lock.

But Paolo noticed that endpoint could be destroyed in sctp_rcv without
sock lock protection. It means the use-after-free issue still could be
triggered when sctp_rcv put and destroy ep after sctp_sock_dump checks
!ep, although it's pretty hard to reproduce.

I could reproduce it by mdelay in sctp_rcv while msleep in sctp_close
and sctp_sock_dump long time.

This patch is to add another param cb_done to sctp_for_each_transport
and dump ep->assocs with holding tsp after jumping out of transport's
traversal in it to avoid this issue.

It can also improve sctp diag dump to make it run faster, as no need
to save sk into cb->args[5] and keep calling sctp_for_each_transport
any more.

This patch is also to use int * instead of int for the pos argument
in sctp_for_each_transport, which could make postion increment only
in sctp_for_each_transport and no need to keep changing cb->args[2]
in sctp_sock_filter and sctp_sock_dump any more.

Fixes: 2959b44e60ae ("sctp: ensure ep is not destroyed before doing the dump")
Reported-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sctp/sctp.h
net/sctp/sctp_diag.c
net/sctp/socket.c