mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
SUNRPC: Cache the process user cred in the RPC server listener
In order to be able to interpret uids and gids correctly in knfsd, we should cache the user namespace of the process that created the RPC server's listener. To do so, we refcount the credential of that process. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
committed by
J. Bruce Fields
parent
e333f3bbef
commit
4df493a260
@@ -136,6 +136,7 @@ static void svc_xprt_free(struct kref *kref)
|
||||
struct module *owner = xprt->xpt_class->xcl_owner;
|
||||
if (test_bit(XPT_CACHE_AUTH, &xprt->xpt_flags))
|
||||
svcauth_unix_info_release(xprt);
|
||||
put_cred(xprt->xpt_cred);
|
||||
put_net(xprt->xpt_net);
|
||||
/* See comment on corresponding get in xs_setup_bc_tcp(): */
|
||||
if (xprt->xpt_bc_xprt)
|
||||
@@ -252,7 +253,8 @@ void svc_add_new_perm_xprt(struct svc_serv *serv, struct svc_xprt *new)
|
||||
|
||||
static int _svc_create_xprt(struct svc_serv *serv, const char *xprt_name,
|
||||
struct net *net, const int family,
|
||||
const unsigned short port, int flags)
|
||||
const unsigned short port, int flags,
|
||||
const struct cred *cred)
|
||||
{
|
||||
struct svc_xprt_class *xcl;
|
||||
|
||||
@@ -273,6 +275,7 @@ static int _svc_create_xprt(struct svc_serv *serv, const char *xprt_name,
|
||||
module_put(xcl->xcl_owner);
|
||||
return PTR_ERR(newxprt);
|
||||
}
|
||||
newxprt->xpt_cred = get_cred(cred);
|
||||
svc_add_new_perm_xprt(serv, newxprt);
|
||||
newport = svc_xprt_local_port(newxprt);
|
||||
return newport;
|
||||
@@ -286,15 +289,16 @@ static int _svc_create_xprt(struct svc_serv *serv, const char *xprt_name,
|
||||
|
||||
int svc_create_xprt(struct svc_serv *serv, const char *xprt_name,
|
||||
struct net *net, const int family,
|
||||
const unsigned short port, int flags)
|
||||
const unsigned short port, int flags,
|
||||
const struct cred *cred)
|
||||
{
|
||||
int err;
|
||||
|
||||
dprintk("svc: creating transport %s[%d]\n", xprt_name, port);
|
||||
err = _svc_create_xprt(serv, xprt_name, net, family, port, flags);
|
||||
err = _svc_create_xprt(serv, xprt_name, net, family, port, flags, cred);
|
||||
if (err == -EPROTONOSUPPORT) {
|
||||
request_module("svc%s", xprt_name);
|
||||
err = _svc_create_xprt(serv, xprt_name, net, family, port, flags);
|
||||
err = _svc_create_xprt(serv, xprt_name, net, family, port, flags, cred);
|
||||
}
|
||||
if (err < 0)
|
||||
dprintk("svc: transport %s not found, err %d\n",
|
||||
|
Reference in New Issue
Block a user