Marcelo Ricardo Leitner 2d45a02d01 sctp: fix ASCONF list handling
->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.

Fixes: 9f7d653b67ae ("sctp: Add Auto-ASCONF support (core).")
Reported-by: Ji Jianwen <jiji@redhat.com>
Suggested-by: Neil Horman <nhorman@tuxdriver.com>
Suggested-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2015-06-14 12:55:49 -07:00
..
2015-06-14 12:55:49 -07:00
2015-06-14 12:55:49 -07:00
2014-09-18 10:54:36 +02:00
2015-03-04 00:23:23 -05:00
2015-04-26 22:59:53 -04:00
2015-05-03 22:17:40 -04:00
2015-03-06 21:50:02 -05:00
2013-11-07 19:28:58 -05:00
2015-03-12 14:39:40 -04:00
2014-09-30 01:02:26 -04:00
2015-03-12 14:39:40 -04:00
2014-06-04 22:46:38 -07:00
2015-01-18 01:56:32 -05:00
2015-03-17 22:02:29 -04:00
2015-03-11 16:22:14 -04:00
2015-03-12 14:39:40 -04:00
2015-04-07 22:24:37 -04:00
2014-01-03 20:56:48 -05:00
2015-03-12 14:39:40 -04:00
2015-01-15 18:26:16 -05:00
2014-06-02 11:00:41 -07:00
2015-04-09 00:01:38 -04:00
2015-03-12 22:58:12 -04:00
2014-05-22 14:57:15 -04:00