linux-uconsole/net/sctp
Vlad Yasevich 6552df6df2 sctp: Fix a race between ICMP protocol unreachable and connect()
commit 50b5d6ad63 upstream.

ICMP protocol unreachable handling completely disregarded
the fact that the user may have locked the socket.  It proceeded
to destroy the association, even though the user may have
held the lock and had a ref on the association.  This resulted
in the following:

Attempt to release alive inet socket f6afcc00

=========================
[ BUG: held lock freed! ]
-------------------------
somenu/2672 is freeing memory f6afcc00-f6afcfff, with a lock still held
there!
 (sk_lock-AF_INET){+.+.+.}, at: [<c122098a>] sctp_connect+0x13/0x4c
1 lock held by somenu/2672:
 #0:  (sk_lock-AF_INET){+.+.+.}, at: [<c122098a>] sctp_connect+0x13/0x4c

stack backtrace:
Pid: 2672, comm: somenu Not tainted 2.6.32-telco #55
Call Trace:
 [<c1232266>] ? printk+0xf/0x11
 [<c1038553>] debug_check_no_locks_freed+0xce/0xff
 [<c10620b4>] kmem_cache_free+0x21/0x66
 [<c1185f25>] __sk_free+0x9d/0xab
 [<c1185f9c>] sk_free+0x1c/0x1e
 [<c1216e38>] sctp_association_put+0x32/0x89
 [<c1220865>] __sctp_connect+0x36d/0x3f4
 [<c122098a>] ? sctp_connect+0x13/0x4c
 [<c102d073>] ? autoremove_wake_function+0x0/0x33
 [<c12209a8>] sctp_connect+0x31/0x4c
 [<c11d1e80>] inet_dgram_connect+0x4b/0x55
 [<c11834fa>] sys_connect+0x54/0x71
 [<c103a3a2>] ? lock_release_non_nested+0x88/0x239
 [<c1054026>] ? might_fault+0x42/0x7c
 [<c1054026>] ? might_fault+0x42/0x7c
 [<c11847ab>] sys_socketcall+0x6d/0x178
 [<c10da994>] ? trace_hardirqs_on_thunk+0xc/0x10
 [<c1002959>] syscall_call+0x7/0xb

This was because the sctp_wait_for_connect() would aqcure the socket
lock and then proceed to release the last reference count on the
association, thus cause the fully destruction path to finish freeing
the socket.

The simplest solution is to start a very short timer in case the socket
is owned by user.  When the timer expires, we can do some verification
and be able to do the release properly.

Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2011-01-07 14:43:18 -08:00
..
associola.c sctp: Set source addresses on the association before adding transports 2009-11-13 19:56:50 -08:00
auth.c fix similar typos to successfull 2009-01-08 08:31:15 -08:00
bind_addr.c sctp: Sysctl configuration for IPv4 Address Scoping 2009-09-04 18:21:01 -04:00
chunk.c sctp: Don't do NAGLE delay on large writes that were fragmented small 2009-09-04 18:20:59 -04:00
command.c [SCTP]: Remove sctp_add_cmd_sf wrapper bloat 2008-03-27 17:54:29 -07:00
debug.c net: mark read-only arrays as const 2009-08-05 10:42:58 -07:00
endpointola.c net: fix sctp breakage 2009-03-18 19:12:42 -07:00
input.c sctp: Fix a race between ICMP protocol unreachable and connect() 2011-01-07 14:43:18 -08:00
inqueue.c [SCTP]: Stop claiming that this is a "reference implementation" 2008-02-05 10:59:07 -05:00
ipv6.c net: constify struct inet6_protocol 2009-09-14 17:03:05 -07:00
Kconfig sctp: Don't abort initialization when CONFIG_PROC_FS=n 2008-07-18 23:03:44 -07:00
Makefile sctp: Don't abort initialization when CONFIG_PROC_FS=n 2008-07-18 23:03:44 -07:00
objcnt.c [NET]: Fix heavy stack usage in seq_file output routines. 2008-04-24 01:02:16 -07:00
output.c sctp: Do not reset the packet during sctp_packet_config(). 2010-09-26 17:21:35 -07:00
outqueue.c sctp: on T3_RTX retransmit all the in-flight chunks 2009-11-29 00:14:02 -08:00
primitive.c [SCTP]: Stop claiming that this is a "reference implementation" 2008-02-05 10:59:07 -05:00
proc.c sctp: use proc_create() 2009-09-04 18:20:58 -04:00
protocol.c Limit sysctl_tcp_mem and sysctl_udp_mem initializers to prevent integer overflows. 2010-12-09 13:27:06 -08:00
sm_make_chunk.c sctp: fix append error cause to ERROR chunk correctly 2010-07-05 11:11:21 -07:00
sm_sideeffect.c sctp: Fix a race between ICMP protocol unreachable and connect() 2011-01-07 14:43:18 -08:00
sm_statefuns.c sctp: Set source addresses on the association before adding transports 2009-11-13 19:56:50 -08:00
sm_statetable.c sctp: fix a typo in net/sctp/sm_statetable.c 2009-06-03 09:14:45 -04:00
socket.c sctp: Fix regression introduced by new sctp_connectx api 2009-11-13 19:56:51 -08:00
ssnmap.c [SCTP]: Stop claiming that this is a "reference implementation" 2008-02-05 10:59:07 -05:00
sysctl.c sctp: Sysctl configuration for IPv4 Address Scoping 2009-09-04 18:21:01 -04:00
transport.c sctp: Fix a race between ICMP protocol unreachable and connect() 2011-01-07 14:43:18 -08:00
tsnmap.c trivial: fix then -> than typos in comments and documentation 2009-01-06 11:28:06 +01:00
ulpevent.c sctp: Use frag list abstraction interfaces. 2009-06-09 00:24:07 -07:00
ulpqueue.c net: Remove __skb_insert() calls outside of skbuff internals. 2008-09-21 21:28:51 -07:00