Patch "sctp: assign assoc_id earlier in __sctp_connect" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
sctp: assign assoc_id earlier in __sctp_connect
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
sctp-assign-assoc_id-earlier-in-__sctp_connect.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Fri Nov 18 11:09:43 CET 2016
From: Marcelo Ricardo Leitner <[email protected]>
Date: Thu, 3 Nov 2016 17:03:41 -0200
Subject: sctp: assign assoc_id earlier in __sctp_connect
From: Marcelo Ricardo Leitner <[email protected]>
[ Upstream commit 7233bc84a3aeda835d334499dc00448373caf5c0 ]
sctp_wait_for_connect() currently already holds the asoc to keep it alive during the sleep, in case another thread release it. But Andrey Konovalov and Dmitry Vyukov reported an use-after-free in such situation.
Problem is that __sctp_connect() doesn't get a ref on the asoc and will do a read on the asoc after calling sctp_wait_for_connect(), but by then another thread may have closed it and the _put on sctp_wait_for_connect will actually release it, causing the use-after-free.
Fix is, instead of doing the read after waiting for the connect, do it before so, and avoid this issue as the socket is still locked by then. There should be no issue on returning the asoc id in case of failure as the application shouldn't trust on that number in such situations anyway.
This issue doesn't exist in sctp_sendmsg() path.
--- net/sctp/socket.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
net/sctp/socket.c +5 -2
@@ -1212,9 +1212,12 @@ static int __sctp_connect(struct sock *s timeo =sock_sndtimeo (sk, f_flags &O_NONBLOCK ); - err =sctp_wait_for_connect (asoc, &timeo); -if ((err ==0 || err == -EINPROGRESS ) && assoc_id) +if (assoc_id) *assoc_id = asoc->assoc_id; + err =sctp_wait_for_connect (asoc, &timeo); +/* Note: the asoc may be freed after the return of +* sctp_wait_for_connect. +*/ /* Don't free association on exit. */ asoc =NULL ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/sctp-assign-assoc_id-earlier-in-__sctp_connect.patch