linux/net/sunrpc/auth_null.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * linux/net/sunrpc/auth_null.c
   4 *
   5 * AUTH_NULL authentication. Really :-)
   6 *
   7 * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
   8 */
   9
  10#include <linux/types.h>
  11#include <linux/module.h>
  12#include <linux/sunrpc/clnt.h>
  13
  14#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
  15# define RPCDBG_FACILITY        RPCDBG_AUTH
  16#endif
  17
  18static struct rpc_auth null_auth;
  19static struct rpc_cred null_cred;
  20
  21static struct rpc_auth *
  22nul_create(struct rpc_auth_create_args *args, struct rpc_clnt *clnt)
  23{
  24        atomic_inc(&null_auth.au_count);
  25        return &null_auth;
  26}
  27
  28static void
  29nul_destroy(struct rpc_auth *auth)
  30{
  31}
  32
  33/*
  34 * Lookup NULL creds for current process
  35 */
  36static struct rpc_cred *
  37nul_lookup_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
  38{
  39        if (flags & RPCAUTH_LOOKUP_RCU)
  40                return &null_cred;
  41        return get_rpccred(&null_cred);
  42}
  43
  44/*
  45 * Destroy cred handle.
  46 */
  47static void
  48nul_destroy_cred(struct rpc_cred *cred)
  49{
  50}
  51
  52/*
  53 * Match cred handle against current process
  54 */
  55static int
  56nul_match(struct auth_cred *acred, struct rpc_cred *cred, int taskflags)
  57{
  58        return 1;
  59}
  60
  61/*
  62 * Marshal credential.
  63 */
  64static __be32 *
  65nul_marshal(struct rpc_task *task, __be32 *p)
  66{
  67        *p++ = htonl(RPC_AUTH_NULL);
  68        *p++ = 0;
  69        *p++ = htonl(RPC_AUTH_NULL);
  70        *p++ = 0;
  71
  72        return p;
  73}
  74
  75/*
  76 * Refresh credential. This is a no-op for AUTH_NULL
  77 */
  78static int
  79nul_refresh(struct rpc_task *task)
  80{
  81        set_bit(RPCAUTH_CRED_UPTODATE, &task->tk_rqstp->rq_cred->cr_flags);
  82        return 0;
  83}
  84
  85static __be32 *
  86nul_validate(struct rpc_task *task, __be32 *p)
  87{
  88        rpc_authflavor_t        flavor;
  89        u32                     size;
  90
  91        flavor = ntohl(*p++);
  92        if (flavor != RPC_AUTH_NULL) {
  93                printk("RPC: bad verf flavor: %u\n", flavor);
  94                return ERR_PTR(-EIO);
  95        }
  96
  97        size = ntohl(*p++);
  98        if (size != 0) {
  99                printk("RPC: bad verf size: %u\n", size);
 100                return ERR_PTR(-EIO);
 101        }
 102
 103        return p;
 104}
 105
 106const struct rpc_authops authnull_ops = {
 107        .owner          = THIS_MODULE,
 108        .au_flavor      = RPC_AUTH_NULL,
 109        .au_name        = "NULL",
 110        .create         = nul_create,
 111        .destroy        = nul_destroy,
 112        .lookup_cred    = nul_lookup_cred,
 113};
 114
 115static
 116struct rpc_auth null_auth = {
 117        .au_cslack      = NUL_CALLSLACK,
 118        .au_rslack      = NUL_REPLYSLACK,
 119        .au_flags       = RPCAUTH_AUTH_NO_CRKEY_TIMEOUT,
 120        .au_ops         = &authnull_ops,
 121        .au_flavor      = RPC_AUTH_NULL,
 122        .au_count       = ATOMIC_INIT(0),
 123};
 124
 125static
 126const struct rpc_credops null_credops = {
 127        .cr_name        = "AUTH_NULL",
 128        .crdestroy      = nul_destroy_cred,
 129        .crbind         = rpcauth_generic_bind_cred,
 130        .crmatch        = nul_match,
 131        .crmarshal      = nul_marshal,
 132        .crrefresh      = nul_refresh,
 133        .crvalidate     = nul_validate,
 134};
 135
 136static
 137struct rpc_cred null_cred = {
 138        .cr_lru         = LIST_HEAD_INIT(null_cred.cr_lru),
 139        .cr_auth        = &null_auth,
 140        .cr_ops         = &null_credops,
 141        .cr_count       = ATOMIC_INIT(1),
 142        .cr_flags       = 1UL << RPCAUTH_CRED_UPTODATE,
 143};
 144