android_kernel_sony_sdm845/include/linux/sunrpc
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Vasily Averin 37c791a031 sunrpc: use-after-free in svc_process_common()
commit d4b09acf924b84bae77cad090a9d108e70b43643 upstream.

if node have NFSv41+ mounts inside several net namespaces
it can lead to use-after-free in svc_process_common()

svc_process_common()
        /* Setup reply header */
        rqstp->rq_xprt->xpt_ops->xpo_prep_reply_hdr(rqstp); <<< HERE

svc_process_common() can use incorrect rqstp->rq_xprt,
its caller function bc_svc_process() takes it from serv->sv_bc_xprt.
The problem is that serv is global structure but sv_bc_xprt
is assigned per-netnamespace.

According to Trond, the whole "let's set up rqstp->rq_xprt
for the back channel" is nothing but a giant hack in order
to work around the fact that svc_process_common() uses it
to find the xpt_ops, and perform a couple of (meaningless
for the back channel) tests of xpt_flags.

All we really need in svc_process_common() is to be able to run
rqstp->rq_xprt->xpt_ops->xpo_prep_reply_hdr()

Bruce J Fields points that this xpo_prep_reply_hdr() call
is an awfully roundabout way just to do "svc_putnl(resv, 0);"
in the tcp case.

This patch does not initialiuze rqstp->rq_xprt in bc_svc_process(),
now it calls svc_process_common() with rqstp->rq_xprt = NULL.

To adjust reply header svc_process_common() just check
rqstp->rq_prot and calls svc_tcp_prep_reply_hdr() for tcp case.

To handle rqstp->rq_xprt = NULL case in functions called from
svc_process_common() patch intruduces net namespace pointer
svc_rqst->rq_bc_net and adjust SVC_NET() definition.
Some other function was also adopted to properly handle described case.

Signed-off-by: Vasily Averin <vvs@virtuozzo.com>
Cc: stable@vger.kernel.org
Fixes: 23c20ecd44 ("NFS: callback up - users counting cleanup")
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
v2: - added lost extern svc_tcp_prep_reply_hdr()
    - dropped trace_svc_process() changes
    - context fixes in svc_process_common()
Signed-off-by: Vasily Averin <vvs@virtuozzo.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2019-01-16 22:12:33 +01:00
..
addr.h
auth.h sunrpc: add hash_cred() function to rpc_authops struct 2016-09-30 15:28:46 -04:00
auth_gss.h
bc_xprt.h
cache.h sunrpc: remove 'inuse' flag from struct cache_detail. 2016-07-13 15:32:47 -04:00
clnt.h NFSv4 client live hangs after live data migration recovery 2018-09-09 20:01:23 +02:00
debug.h
gss_api.h xprtrdma: No direct data placement with krb5i and krb5p 2016-07-11 15:50:43 -04:00
gss_asn1.h
gss_err.h
gss_krb5.h
gss_krb5_enctypes.h
metrics.h
msg_prot.h sunrpc: Update RPCBIND_MAXNETIDLEN 2016-05-17 15:47:56 -04:00
rpc_pipe_fs.h
rpc_rdma.h rpcrdma: RDMA/CM private message data structure 2016-09-23 10:18:53 -04:00
sched.h SUNRPC: Generalize the RPC buffer release API 2016-09-19 13:08:37 -04:00
stats.h
svc.h sunrpc: use-after-free in svc_process_common() 2019-01-16 22:12:33 +01:00
svc_rdma.h svcrdma: support Remote Invalidation 2016-09-23 10:18:54 -04:00
svc_xprt.h sunrpc: don't call sleeping functions from the notifier block callbacks 2017-01-26 08:24:37 +01:00
svcauth.h vfs: make the string hashes salt the hash 2016-06-10 20:21:46 -07:00
svcauth_gss.h
svcsock.h
timer.h
types.h
xdr.h SUNRPC: Refactor rpc_xdr_buf_init() 2016-09-19 13:08:37 -04:00
xprt.h SUNRPC: Add a transport-specific private field in rpc_rqst 2016-09-19 13:08:37 -04:00
xprtmultipath.h SUNRPC search xprt switch for sockaddr 2016-09-19 13:08:36 -04:00
xprtrdma.h xprtrdma: Support larger inline thresholds 2016-09-19 13:08:38 -04:00
xprtsock.h SUNRPC: Small optimisation of client receive 2016-06-13 12:35:51 -04:00