On Fri, Sep 15, 2017 at 11:02:21AM +0800, Xin Long wrote: > Commit 86fdb3448cc1 ("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: 86fdb3448cc1 ("sctp: ensure ep is not destroyed before doing the dump") > Reported-by: Paolo Abeni <pabeni@xxxxxxxxxx> > Signed-off-by: Xin Long <lucien.xin@xxxxxxxxx> > --- > include/net/sctp/sctp.h | 3 ++- > net/sctp/sctp_diag.c | 32 +++++++++----------------------- > net/sctp/socket.c | 40 +++++++++++++++++++++++++--------------- > 3 files changed, 36 insertions(+), 39 deletions(-) > Acked-by: Neil Horman <nhorman@xxxxxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-sctp" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html