Patch "sctp: fix ASCONF list handling" has been added to the 4.1-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
sctp: fix ASCONF list handling
to the 4.1-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-fix-asconf-list-handling.patch
and it can be found in the queue-4.1 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 Jul 3 20:00:25 PDT 2015
From: Marcelo Ricardo Leitner <[email protected]>
Date: Fri, 12 Jun 2015 10:16:41 -0300
Subject: sctp: fix ASCONF list handling
From: Marcelo Ricardo Leitner <[email protected]>
[ Upstream commit 2d45a02d0166caf2627fe91897c6ffc3b19514c4 ]
->auto_asconf_splist is per namespace and mangled by functions like sctp_setsockopt_auto_asconf() which doesn't guarantee any serialization.
Also, the call to inet_sk_copy_descendant() was backuping ->auto_asconf_list through the copy but was not honoring ->do_auto_asconf, which could lead to list corruption if it was different between both sockets.
This commit thus fixes the list handling by using ->addr_wq_lock spinlock to protect the list. A special handling is done upon socket creation and destruction for that. Error handlig on sctp_init_sock() will never return an error after having initialized asconf, so sctp_destroy_sock() can be called without addrq_wq_lock. The lock now will be take on sctp_close_sock(), before locking the socket, so we don't do it in inverse order compared to sctp_addr_wq_timeout_handler().
Instead of taking the lock on sctp_sock_migrate() for copying and restoring the list values, it's preferred to avoid rewritting it by implementing sctp_copy_descendant().
Issue was found with a test application that kept flipping sysctl default_auto_asconf on and off, but one could trigger it by issuing simultaneous setsockopt() calls on multiple sockets or by creating/destroying sockets fast enough. This is only triggerable locally.
--- include/net/netns/sctp.h | 1 + include/net/sctp/structs.h | 4 ++++ net/sctp/socket.c | 43 ++++++++++++++++++++++++++++++++----------- 3 files changed, 37 insertions(+), 11 deletions(-)
include/net/netns/sctp.h +1 -0
@@ -31,6 +31,7 @@ struct netns_sctp {struct list_head addr_waitq;struct timer_list addr_wq_timer;struct list_head auto_asconf_splist; +/* Lock that protects both addr_waitq and auto_asconf_splist */ spinlock_t addr_wq_lock;/* Lock that protects the local_addr_list writers */
include/net/sctp/structs.h +4 -0
@@ -223,6 +223,10 @@ struct sctp_sock {atomic_t pd_mode;/* Receive to here while partial delivery is in effect. */ struct sk_buff_head pd_lobby; + +/* These must be the last fields, as they will skipped on copies, +* like on accept and peeloff operations +*/ struct list_head auto_asconf_list;int do_auto_asconf; };
net/sctp/socket.c +32 -11
102 lines not on this page · raw message
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/sctp-fix-asconf-list-handling.patch queue-4.1/sctp-fix-race-between-ootb-responce-and-route-removal.patch