linux-uconsole/net/sunrpc
NeilBrown e98a198d71 sunrpc: prevent use-after-free on clearing XPT_BUSY
commit ed2849d3ec upstream.

When an xprt is created, it has a refcount of 1, and XPT_BUSY is set.
The refcount is *not* owned by the thread that created the xprt
(as is clear from the fact that creators never put the reference).
Rather, it is owned by the absence of XPT_DEAD.  Once XPT_DEAD is set,
(And XPT_BUSY is clear) that initial reference is dropped and the xprt
can be freed.

So when a creator clears XPT_BUSY it is dropping its only reference and
so must not touch the xprt again.

However svc_recv, after calling ->xpo_accept (and so getting an XPT_BUSY
reference on a new xprt), calls svc_xprt_recieved.  This clears
XPT_BUSY and then svc_xprt_enqueue - this last without owning a reference.
This is dangerous and has been seen to leave svc_xprt_enqueue working
with an xprt containing garbage.

So we need to hold an extra counted reference over that call to
svc_xprt_received.

For safety, any time we clear XPT_BUSY and then use the xprt again, we
first get a reference, and the put it again afterwards.

Note that svc_close_all does not need this extra protection as there are
no threads running, and the final free can only be called asynchronously
from such a thread.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2011-01-07 13:58:17 -08:00
..
auth_gss gss:spkm3 miss returning error to caller when import security context 2010-09-12 19:55:26 -04:00
xprtrdma rpcrdma: Fix SQ size calculation when memreg is FRMR 2010-08-11 12:47:24 -04:00
addr.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
auth.c sunrpc: increase MAX_HASHTABLE_BITS to 14 2010-09-12 19:55:26 -04:00
auth_generic.c SUNRPC: Clean up of rpc_bindcred() 2010-08-04 08:54:08 -04:00
auth_null.c SUNRPC: Move the bound cred to struct rpc_rqst 2010-08-04 08:54:09 -04:00
auth_unix.c SUNRPC: Move the bound cred to struct rpc_rqst 2010-08-04 08:54:09 -04:00
backchannel_rqst.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
bc_svc.c Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 2010-04-11 14:53:53 -07:00
cache.c net: sunrpc: removed duplicated #include 2010-08-06 17:05:39 -04:00
clnt.c SUNRPC: After calling xprt_release(), we must restart from call_reserve 2010-12-09 13:32:18 -08:00
Kconfig NFS: Fix the selection of security flavours in Kconfig 2010-08-17 17:42:45 -04:00
Makefile SUNRPC: Provide functions for managing universal addresses 2009-08-09 15:09:34 -04:00
rpc_pipe.c SUNRPC: Fix a race in rpc_info_open 2010-09-12 19:55:25 -04:00
rpcb_clnt.c kernel-wide: replace USHORT_MAX, SHORT_MAX and SHORT_MIN with USHRT_MAX, SHRT_MAX and SHRT_MIN 2010-05-25 08:07:02 -07:00
sched.c SUNRPC: Reduce asynchronous RPC task stack usage 2010-08-04 08:54:09 -04:00
socklib.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
stats.c SUNRPC: Move the task->tk_bytes_sent and tk_rtt to struct rpc_rqst 2010-05-14 15:09:36 -04:00
sunrpc.h nfsd41: sunrpc: Added rpc server-side backchannel handling 2009-09-11 15:04:16 -04:00
sunrpc_syms.c Merge branch 'for-2.6.36' of git://linux-nfs.org/~bfields/linux 2010-08-07 14:24:41 -07:00
svc.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
svc_xprt.c sunrpc: prevent use-after-free on clearing XPT_BUSY 2011-01-07 13:58:17 -08:00
svcauth.c net: Move && and || to end of previous line 2009-11-29 16:55:45 -08:00
svcauth_unix.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
svcsock.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6 2010-05-20 21:04:44 -07:00
sysctl.c sysctl: Drop & in front of every proc_handler. 2009-11-18 08:37:40 -08:00
timer.c SUNRPC: Add documenting comments in net/sunrpc/timer.c 2009-08-09 15:09:47 -04:00
xdr.c xdr: Add an export for the helper function write_bytes_to_xdr_buf() 2010-05-14 15:09:18 -04:00
xprt.c SUNRPC: prevent task_cleanup running on freed xprt 2010-08-04 08:54:10 -04:00
xprtsock.c net: fix a lockdep splat 2010-09-24 22:26:10 -07:00