1 // SPDX-License-Identifier: GPL-2.0-only
2 #include <linux/types.h>
3 #include <linux/sched.h>
4 #include <linux/module.h>
5 #include <linux/sunrpc/types.h>
6 #include <linux/sunrpc/xdr.h>
7 #include <linux/sunrpc/svcsock.h>
8 #include <linux/sunrpc/svcauth.h>
9 #include <linux/sunrpc/gss_api.h>
10 #include <linux/sunrpc/addr.h>
11 #include <linux/err.h>
12 #include <linux/seq_file.h>
13 #include <linux/hash.h>
14 #include <linux/string.h>
15 #include <linux/slab.h>
18 #include <linux/kernel.h>
19 #include <linux/user_namespace.h>
20 #include <trace/events/sunrpc.h>
22 #define RPCDBG_FACILITY RPCDBG_AUTH
27 * AUTHUNIX and AUTHNULL credentials are both handled here.
28 * AUTHNULL is treated just like AUTHUNIX except that the uid/gid
29 * are always nobody (-2). i.e. we do the same IP address checks for
30 * AUTHNULL as for AUTHUNIX, and that is done here.
36 /* other stuff later */
39 extern struct auth_ops svcauth_null
;
40 extern struct auth_ops svcauth_unix
;
41 extern struct auth_ops svcauth_tls
;
43 static void svcauth_unix_domain_release_rcu(struct rcu_head
*head
)
45 struct auth_domain
*dom
= container_of(head
, struct auth_domain
, rcu_head
);
46 struct unix_domain
*ud
= container_of(dom
, struct unix_domain
, h
);
52 static void svcauth_unix_domain_release(struct auth_domain
*dom
)
54 call_rcu(&dom
->rcu_head
, svcauth_unix_domain_release_rcu
);
57 struct auth_domain
*unix_domain_find(char *name
)
59 struct auth_domain
*rv
;
60 struct unix_domain
*new = NULL
;
62 rv
= auth_domain_find(name
);
65 if (new && rv
!= &new->h
)
66 svcauth_unix_domain_release(&new->h
);
68 if (rv
->flavour
!= &svcauth_unix
) {
75 new = kmalloc(sizeof(*new), GFP_KERNEL
);
78 kref_init(&new->h
.ref
);
79 new->h
.name
= kstrdup(name
, GFP_KERNEL
);
80 if (new->h
.name
== NULL
) {
84 new->h
.flavour
= &svcauth_unix
;
85 rv
= auth_domain_lookup(name
, &new->h
);
88 EXPORT_SYMBOL_GPL(unix_domain_find
);
91 /**************************************************
92 * cache for IP address to unix_domain
93 * as needed by AUTH_UNIX
96 #define IP_HASHMAX (1<<IP_HASHBITS)
100 char m_class
[8]; /* e.g. "nfsd" */
101 struct in6_addr m_addr
;
102 struct unix_domain
*m_client
;
103 struct rcu_head m_rcu
;
106 static void ip_map_put(struct kref
*kref
)
108 struct cache_head
*item
= container_of(kref
, struct cache_head
, ref
);
109 struct ip_map
*im
= container_of(item
, struct ip_map
,h
);
111 if (test_bit(CACHE_VALID
, &item
->flags
) &&
112 !test_bit(CACHE_NEGATIVE
, &item
->flags
))
113 auth_domain_put(&im
->m_client
->h
);
114 kfree_rcu(im
, m_rcu
);
117 static inline int hash_ip6(const struct in6_addr
*ip
)
119 return hash_32(ipv6_addr_hash(ip
), IP_HASHBITS
);
121 static int ip_map_match(struct cache_head
*corig
, struct cache_head
*cnew
)
123 struct ip_map
*orig
= container_of(corig
, struct ip_map
, h
);
124 struct ip_map
*new = container_of(cnew
, struct ip_map
, h
);
125 return strcmp(orig
->m_class
, new->m_class
) == 0 &&
126 ipv6_addr_equal(&orig
->m_addr
, &new->m_addr
);
128 static void ip_map_init(struct cache_head
*cnew
, struct cache_head
*citem
)
130 struct ip_map
*new = container_of(cnew
, struct ip_map
, h
);
131 struct ip_map
*item
= container_of(citem
, struct ip_map
, h
);
133 strcpy(new->m_class
, item
->m_class
);
134 new->m_addr
= item
->m_addr
;
136 static void update(struct cache_head
*cnew
, struct cache_head
*citem
)
138 struct ip_map
*new = container_of(cnew
, struct ip_map
, h
);
139 struct ip_map
*item
= container_of(citem
, struct ip_map
, h
);
141 kref_get(&item
->m_client
->h
.ref
);
142 new->m_client
= item
->m_client
;
144 static struct cache_head
*ip_map_alloc(void)
146 struct ip_map
*i
= kmalloc(sizeof(*i
), GFP_KERNEL
);
153 static int ip_map_upcall(struct cache_detail
*cd
, struct cache_head
*h
)
155 return sunrpc_cache_pipe_upcall(cd
, h
);
158 static void ip_map_request(struct cache_detail
*cd
,
159 struct cache_head
*h
,
160 char **bpp
, int *blen
)
163 struct ip_map
*im
= container_of(h
, struct ip_map
, h
);
165 if (ipv6_addr_v4mapped(&(im
->m_addr
))) {
166 snprintf(text_addr
, 20, "%pI4", &im
->m_addr
.s6_addr32
[3]);
168 snprintf(text_addr
, 40, "%pI6", &im
->m_addr
);
170 qword_add(bpp
, blen
, im
->m_class
);
171 qword_add(bpp
, blen
, text_addr
);
175 static struct ip_map
*__ip_map_lookup(struct cache_detail
*cd
, char *class, struct in6_addr
*addr
);
176 static int __ip_map_update(struct cache_detail
*cd
, struct ip_map
*ipm
, struct unix_domain
*udom
, time64_t expiry
);
178 static int ip_map_parse(struct cache_detail
*cd
,
179 char *mesg
, int mlen
)
181 /* class ipaddress [domainname] */
182 /* should be safe just to use the start of the input buffer
189 struct sockaddr_in s4
;
190 struct sockaddr_in6 s6
;
192 struct sockaddr_in6 sin6
;
196 struct auth_domain
*dom
;
199 if (mesg
[mlen
-1] != '\n')
204 len
= qword_get(&mesg
, class, sizeof(class));
205 if (len
<= 0) return -EINVAL
;
208 len
= qword_get(&mesg
, buf
, mlen
);
209 if (len
<= 0) return -EINVAL
;
211 if (rpc_pton(cd
->net
, buf
, len
, &address
.sa
, sizeof(address
)) == 0)
213 switch (address
.sa
.sa_family
) {
215 /* Form a mapped IPv4 address in sin6 */
216 sin6
.sin6_family
= AF_INET6
;
217 ipv6_addr_set_v4mapped(address
.s4
.sin_addr
.s_addr
,
220 #if IS_ENABLED(CONFIG_IPV6)
222 memcpy(&sin6
, &address
.s6
, sizeof(sin6
));
229 err
= get_expiry(&mesg
, &expiry
);
233 /* domainname, or empty for NEGATIVE */
234 len
= qword_get(&mesg
, buf
, mlen
);
235 if (len
< 0) return -EINVAL
;
238 dom
= unix_domain_find(buf
);
244 /* IPv6 scope IDs are ignored for now */
245 ipmp
= __ip_map_lookup(cd
, class, &sin6
.sin6_addr
);
247 err
= __ip_map_update(cd
, ipmp
,
248 container_of(dom
, struct unix_domain
, h
),
254 auth_domain_put(dom
);
260 static int ip_map_show(struct seq_file
*m
,
261 struct cache_detail
*cd
,
262 struct cache_head
*h
)
265 struct in6_addr addr
;
266 char *dom
= "-no-domain-";
269 seq_puts(m
, "#class IP domain\n");
272 im
= container_of(h
, struct ip_map
, h
);
273 /* class addr domain */
276 if (test_bit(CACHE_VALID
, &h
->flags
) &&
277 !test_bit(CACHE_NEGATIVE
, &h
->flags
))
278 dom
= im
->m_client
->h
.name
;
280 if (ipv6_addr_v4mapped(&addr
)) {
281 seq_printf(m
, "%s %pI4 %s\n",
282 im
->m_class
, &addr
.s6_addr32
[3], dom
);
284 seq_printf(m
, "%s %pI6 %s\n", im
->m_class
, &addr
, dom
);
290 static struct ip_map
*__ip_map_lookup(struct cache_detail
*cd
, char *class,
291 struct in6_addr
*addr
)
294 struct cache_head
*ch
;
296 strcpy(ip
.m_class
, class);
298 ch
= sunrpc_cache_lookup_rcu(cd
, &ip
.h
,
299 hash_str(class, IP_HASHBITS
) ^
303 return container_of(ch
, struct ip_map
, h
);
308 static int __ip_map_update(struct cache_detail
*cd
, struct ip_map
*ipm
,
309 struct unix_domain
*udom
, time64_t expiry
)
312 struct cache_head
*ch
;
317 set_bit(CACHE_NEGATIVE
, &ip
.h
.flags
);
318 ip
.h
.expiry_time
= expiry
;
319 ch
= sunrpc_cache_update(cd
, &ip
.h
, &ipm
->h
,
320 hash_str(ipm
->m_class
, IP_HASHBITS
) ^
321 hash_ip6(&ipm
->m_addr
));
328 void svcauth_unix_purge(struct net
*net
)
330 struct sunrpc_net
*sn
;
332 sn
= net_generic(net
, sunrpc_net_id
);
333 cache_purge(sn
->ip_map_cache
);
335 EXPORT_SYMBOL_GPL(svcauth_unix_purge
);
337 static inline struct ip_map
*
338 ip_map_cached_get(struct svc_xprt
*xprt
)
340 struct ip_map
*ipm
= NULL
;
341 struct sunrpc_net
*sn
;
343 if (test_bit(XPT_CACHE_AUTH
, &xprt
->xpt_flags
)) {
344 spin_lock(&xprt
->xpt_lock
);
345 ipm
= xprt
->xpt_auth_cache
;
347 sn
= net_generic(xprt
->xpt_net
, sunrpc_net_id
);
348 if (cache_is_expired(sn
->ip_map_cache
, &ipm
->h
)) {
350 * The entry has been invalidated since it was
351 * remembered, e.g. by a second mount from the
354 xprt
->xpt_auth_cache
= NULL
;
355 spin_unlock(&xprt
->xpt_lock
);
356 cache_put(&ipm
->h
, sn
->ip_map_cache
);
361 spin_unlock(&xprt
->xpt_lock
);
367 ip_map_cached_put(struct svc_xprt
*xprt
, struct ip_map
*ipm
)
369 if (test_bit(XPT_CACHE_AUTH
, &xprt
->xpt_flags
)) {
370 spin_lock(&xprt
->xpt_lock
);
371 if (xprt
->xpt_auth_cache
== NULL
) {
372 /* newly cached, keep the reference */
373 xprt
->xpt_auth_cache
= ipm
;
376 spin_unlock(&xprt
->xpt_lock
);
379 struct sunrpc_net
*sn
;
381 sn
= net_generic(xprt
->xpt_net
, sunrpc_net_id
);
382 cache_put(&ipm
->h
, sn
->ip_map_cache
);
387 svcauth_unix_info_release(struct svc_xprt
*xpt
)
391 ipm
= xpt
->xpt_auth_cache
;
393 struct sunrpc_net
*sn
;
395 sn
= net_generic(xpt
->xpt_net
, sunrpc_net_id
);
396 cache_put(&ipm
->h
, sn
->ip_map_cache
);
400 /****************************************************************************
401 * auth.unix.gid cache
402 * simple cache to map a UID to a list of GIDs
403 * because AUTH_UNIX aka AUTH_SYS has a max of UNX_NGROUPS
405 #define GID_HASHBITS 8
406 #define GID_HASHMAX (1<<GID_HASHBITS)
411 struct group_info
*gi
;
415 static int unix_gid_hash(kuid_t uid
)
417 return hash_long(from_kuid(&init_user_ns
, uid
), GID_HASHBITS
);
420 static void unix_gid_free(struct rcu_head
*rcu
)
422 struct unix_gid
*ug
= container_of(rcu
, struct unix_gid
, rcu
);
423 struct cache_head
*item
= &ug
->h
;
425 if (test_bit(CACHE_VALID
, &item
->flags
) &&
426 !test_bit(CACHE_NEGATIVE
, &item
->flags
))
427 put_group_info(ug
->gi
);
431 static void unix_gid_put(struct kref
*kref
)
433 struct cache_head
*item
= container_of(kref
, struct cache_head
, ref
);
434 struct unix_gid
*ug
= container_of(item
, struct unix_gid
, h
);
436 call_rcu(&ug
->rcu
, unix_gid_free
);
439 static int unix_gid_match(struct cache_head
*corig
, struct cache_head
*cnew
)
441 struct unix_gid
*orig
= container_of(corig
, struct unix_gid
, h
);
442 struct unix_gid
*new = container_of(cnew
, struct unix_gid
, h
);
443 return uid_eq(orig
->uid
, new->uid
);
445 static void unix_gid_init(struct cache_head
*cnew
, struct cache_head
*citem
)
447 struct unix_gid
*new = container_of(cnew
, struct unix_gid
, h
);
448 struct unix_gid
*item
= container_of(citem
, struct unix_gid
, h
);
449 new->uid
= item
->uid
;
451 static void unix_gid_update(struct cache_head
*cnew
, struct cache_head
*citem
)
453 struct unix_gid
*new = container_of(cnew
, struct unix_gid
, h
);
454 struct unix_gid
*item
= container_of(citem
, struct unix_gid
, h
);
456 get_group_info(item
->gi
);
459 static struct cache_head
*unix_gid_alloc(void)
461 struct unix_gid
*g
= kmalloc(sizeof(*g
), GFP_KERNEL
);
468 static int unix_gid_upcall(struct cache_detail
*cd
, struct cache_head
*h
)
470 return sunrpc_cache_pipe_upcall_timeout(cd
, h
);
473 static void unix_gid_request(struct cache_detail
*cd
,
474 struct cache_head
*h
,
475 char **bpp
, int *blen
)
478 struct unix_gid
*ug
= container_of(h
, struct unix_gid
, h
);
480 snprintf(tuid
, 20, "%u", from_kuid(&init_user_ns
, ug
->uid
));
481 qword_add(bpp
, blen
, tuid
);
485 static struct unix_gid
*unix_gid_lookup(struct cache_detail
*cd
, kuid_t uid
);
487 static int unix_gid_parse(struct cache_detail
*cd
,
488 char *mesg
, int mlen
)
490 /* uid expiry Ngid gid0 gid1 ... gidN-1 */
498 struct unix_gid ug
, *ugp
;
500 if (mesg
[mlen
- 1] != '\n')
504 rv
= get_int(&mesg
, &id
);
507 uid
= make_kuid(current_user_ns(), id
);
510 err
= get_expiry(&mesg
, &expiry
);
514 rv
= get_int(&mesg
, &gids
);
515 if (rv
|| gids
< 0 || gids
> 8192)
518 ug
.gi
= groups_alloc(gids
);
522 for (i
= 0 ; i
< gids
; i
++) {
525 rv
= get_int(&mesg
, &gid
);
529 kgid
= make_kgid(current_user_ns(), gid
);
530 if (!gid_valid(kgid
))
532 ug
.gi
->gid
[i
] = kgid
;
536 ugp
= unix_gid_lookup(cd
, uid
);
538 struct cache_head
*ch
;
540 ug
.h
.expiry_time
= expiry
;
541 ch
= sunrpc_cache_update(cd
,
554 put_group_info(ug
.gi
);
558 static int unix_gid_show(struct seq_file
*m
,
559 struct cache_detail
*cd
,
560 struct cache_head
*h
)
562 struct user_namespace
*user_ns
= m
->file
->f_cred
->user_ns
;
568 seq_puts(m
, "#uid cnt: gids...\n");
571 ug
= container_of(h
, struct unix_gid
, h
);
572 if (test_bit(CACHE_VALID
, &h
->flags
) &&
573 !test_bit(CACHE_NEGATIVE
, &h
->flags
))
574 glen
= ug
->gi
->ngroups
;
578 seq_printf(m
, "%u %d:", from_kuid_munged(user_ns
, ug
->uid
), glen
);
579 for (i
= 0; i
< glen
; i
++)
580 seq_printf(m
, " %d", from_kgid_munged(user_ns
, ug
->gi
->gid
[i
]));
585 static const struct cache_detail unix_gid_cache_template
= {
586 .owner
= THIS_MODULE
,
587 .hash_size
= GID_HASHMAX
,
588 .name
= "auth.unix.gid",
589 .cache_put
= unix_gid_put
,
590 .cache_upcall
= unix_gid_upcall
,
591 .cache_request
= unix_gid_request
,
592 .cache_parse
= unix_gid_parse
,
593 .cache_show
= unix_gid_show
,
594 .match
= unix_gid_match
,
595 .init
= unix_gid_init
,
596 .update
= unix_gid_update
,
597 .alloc
= unix_gid_alloc
,
600 int unix_gid_cache_create(struct net
*net
)
602 struct sunrpc_net
*sn
= net_generic(net
, sunrpc_net_id
);
603 struct cache_detail
*cd
;
606 cd
= cache_create_net(&unix_gid_cache_template
, net
);
609 err
= cache_register_net(cd
, net
);
611 cache_destroy_net(cd
, net
);
614 sn
->unix_gid_cache
= cd
;
618 void unix_gid_cache_destroy(struct net
*net
)
620 struct sunrpc_net
*sn
= net_generic(net
, sunrpc_net_id
);
621 struct cache_detail
*cd
= sn
->unix_gid_cache
;
623 sn
->unix_gid_cache
= NULL
;
625 cache_unregister_net(cd
, net
);
626 cache_destroy_net(cd
, net
);
629 static struct unix_gid
*unix_gid_lookup(struct cache_detail
*cd
, kuid_t uid
)
632 struct cache_head
*ch
;
635 ch
= sunrpc_cache_lookup_rcu(cd
, &ug
.h
, unix_gid_hash(uid
));
637 return container_of(ch
, struct unix_gid
, h
);
642 static struct group_info
*unix_gid_find(kuid_t uid
, struct svc_rqst
*rqstp
)
645 struct group_info
*gi
;
647 struct sunrpc_net
*sn
= net_generic(rqstp
->rq_xprt
->xpt_net
,
650 ug
= unix_gid_lookup(sn
->unix_gid_cache
, uid
);
652 return ERR_PTR(-EAGAIN
);
653 ret
= cache_check(sn
->unix_gid_cache
, &ug
->h
, &rqstp
->rq_chandle
);
656 return ERR_PTR(-ENOENT
);
658 return ERR_PTR(-ESHUTDOWN
);
660 gi
= get_group_info(ug
->gi
);
661 cache_put(&ug
->h
, sn
->unix_gid_cache
);
664 return ERR_PTR(-EAGAIN
);
669 svcauth_unix_set_client(struct svc_rqst
*rqstp
)
671 struct sockaddr_in
*sin
;
672 struct sockaddr_in6
*sin6
, sin6_storage
;
674 struct group_info
*gi
;
675 struct svc_cred
*cred
= &rqstp
->rq_cred
;
676 struct svc_xprt
*xprt
= rqstp
->rq_xprt
;
677 struct net
*net
= xprt
->xpt_net
;
678 struct sunrpc_net
*sn
= net_generic(net
, sunrpc_net_id
);
680 switch (rqstp
->rq_addr
.ss_family
) {
682 sin
= svc_addr_in(rqstp
);
683 sin6
= &sin6_storage
;
684 ipv6_addr_set_v4mapped(sin
->sin_addr
.s_addr
, &sin6
->sin6_addr
);
687 sin6
= svc_addr_in6(rqstp
);
693 rqstp
->rq_client
= NULL
;
694 if (rqstp
->rq_proc
== 0)
697 rqstp
->rq_auth_stat
= rpc_autherr_badcred
;
698 ipm
= ip_map_cached_get(xprt
);
700 ipm
= __ip_map_lookup(sn
->ip_map_cache
,
701 rqstp
->rq_server
->sv_programs
->pg_class
,
707 switch (cache_check(sn
->ip_map_cache
, &ipm
->h
, &rqstp
->rq_chandle
)) {
717 rqstp
->rq_client
= &ipm
->m_client
->h
;
718 kref_get(&rqstp
->rq_client
->ref
);
719 ip_map_cached_put(xprt
, ipm
);
723 gi
= unix_gid_find(cred
->cr_uid
, rqstp
);
724 switch (PTR_ERR(gi
)) {
732 put_group_info(cred
->cr_group_info
);
733 cred
->cr_group_info
= gi
;
737 rqstp
->rq_auth_stat
= rpc_auth_ok
;
740 EXPORT_SYMBOL_GPL(svcauth_unix_set_client
);
743 * svcauth_null_accept - Decode and validate incoming RPC_AUTH_NULL credential
744 * @rqstp: RPC transaction
747 * %SVC_OK: Both credential and verifier are valid
748 * %SVC_DENIED: Credential or verifier is not valid
749 * %SVC_GARBAGE: Failed to decode credential or verifier
750 * %SVC_CLOSE: Temporary failure
752 * rqstp->rq_auth_stat is set as mandated by RFC 5531.
754 static enum svc_auth_status
755 svcauth_null_accept(struct svc_rqst
*rqstp
)
757 struct xdr_stream
*xdr
= &rqstp
->rq_arg_stream
;
758 struct svc_cred
*cred
= &rqstp
->rq_cred
;
762 /* Length of Call's credential body field: */
763 if (xdr_stream_decode_u32(xdr
, &len
) < 0)
766 rqstp
->rq_auth_stat
= rpc_autherr_badcred
;
770 /* Call's verf field: */
771 if (xdr_stream_decode_opaque_auth(xdr
, &flavor
, &body
, &len
) < 0)
773 if (flavor
!= RPC_AUTH_NULL
|| len
!= 0) {
774 rqstp
->rq_auth_stat
= rpc_autherr_badverf
;
778 /* Signal that mapping to nobody uid/gid is required */
779 cred
->cr_uid
= INVALID_UID
;
780 cred
->cr_gid
= INVALID_GID
;
781 cred
->cr_group_info
= groups_alloc(0);
782 if (cred
->cr_group_info
== NULL
)
783 return SVC_CLOSE
; /* kmalloc failure - client must retry */
785 if (xdr_stream_encode_opaque_auth(&rqstp
->rq_res_stream
,
786 RPC_AUTH_NULL
, NULL
, 0) < 0)
788 if (!svcxdr_set_accept_stat(rqstp
))
791 rqstp
->rq_cred
.cr_flavor
= RPC_AUTH_NULL
;
796 svcauth_null_release(struct svc_rqst
*rqstp
)
798 if (rqstp
->rq_client
)
799 auth_domain_put(rqstp
->rq_client
);
800 rqstp
->rq_client
= NULL
;
801 if (rqstp
->rq_cred
.cr_group_info
)
802 put_group_info(rqstp
->rq_cred
.cr_group_info
);
803 rqstp
->rq_cred
.cr_group_info
= NULL
;
805 return 0; /* don't drop */
809 struct auth_ops svcauth_null
= {
811 .owner
= THIS_MODULE
,
812 .flavour
= RPC_AUTH_NULL
,
813 .accept
= svcauth_null_accept
,
814 .release
= svcauth_null_release
,
815 .set_client
= svcauth_unix_set_client
,
820 * svcauth_tls_accept - Decode and validate incoming RPC_AUTH_TLS credential
821 * @rqstp: RPC transaction
824 * %SVC_OK: Both credential and verifier are valid
825 * %SVC_DENIED: Credential or verifier is not valid
826 * %SVC_GARBAGE: Failed to decode credential or verifier
827 * %SVC_CLOSE: Temporary failure
829 * rqstp->rq_auth_stat is set as mandated by RFC 5531.
831 static enum svc_auth_status
832 svcauth_tls_accept(struct svc_rqst
*rqstp
)
834 struct xdr_stream
*xdr
= &rqstp
->rq_arg_stream
;
835 struct svc_cred
*cred
= &rqstp
->rq_cred
;
836 struct svc_xprt
*xprt
= rqstp
->rq_xprt
;
841 /* Length of Call's credential body field: */
842 if (xdr_stream_decode_u32(xdr
, &len
) < 0)
845 rqstp
->rq_auth_stat
= rpc_autherr_badcred
;
849 /* Call's verf field: */
850 if (xdr_stream_decode_opaque_auth(xdr
, &flavor
, &body
, &len
) < 0)
852 if (flavor
!= RPC_AUTH_NULL
|| len
!= 0) {
853 rqstp
->rq_auth_stat
= rpc_autherr_badverf
;
857 /* AUTH_TLS is not valid on non-NULL procedures */
858 if (rqstp
->rq_proc
!= 0) {
859 rqstp
->rq_auth_stat
= rpc_autherr_badcred
;
863 /* Signal that mapping to nobody uid/gid is required */
864 cred
->cr_uid
= INVALID_UID
;
865 cred
->cr_gid
= INVALID_GID
;
866 cred
->cr_group_info
= groups_alloc(0);
867 if (cred
->cr_group_info
== NULL
)
870 if (xprt
->xpt_ops
->xpo_handshake
) {
871 p
= xdr_reserve_space(&rqstp
->rq_res_stream
, XDR_UNIT
* 2 + 8);
874 trace_svc_tls_start(xprt
);
875 *p
++ = rpc_auth_null
;
876 *p
++ = cpu_to_be32(8);
877 memcpy(p
, "STARTTLS", 8);
879 set_bit(XPT_HANDSHAKE
, &xprt
->xpt_flags
);
880 svc_xprt_enqueue(xprt
);
882 trace_svc_tls_unavailable(xprt
);
883 if (xdr_stream_encode_opaque_auth(&rqstp
->rq_res_stream
,
884 RPC_AUTH_NULL
, NULL
, 0) < 0)
887 if (!svcxdr_set_accept_stat(rqstp
))
890 rqstp
->rq_cred
.cr_flavor
= RPC_AUTH_TLS
;
894 struct auth_ops svcauth_tls
= {
896 .owner
= THIS_MODULE
,
897 .flavour
= RPC_AUTH_TLS
,
898 .accept
= svcauth_tls_accept
,
899 .release
= svcauth_null_release
,
900 .set_client
= svcauth_unix_set_client
,
905 * svcauth_unix_accept - Decode and validate incoming RPC_AUTH_SYS credential
906 * @rqstp: RPC transaction
909 * %SVC_OK: Both credential and verifier are valid
910 * %SVC_DENIED: Credential or verifier is not valid
911 * %SVC_GARBAGE: Failed to decode credential or verifier
912 * %SVC_CLOSE: Temporary failure
914 * rqstp->rq_auth_stat is set as mandated by RFC 5531.
916 static enum svc_auth_status
917 svcauth_unix_accept(struct svc_rqst
*rqstp
)
919 struct xdr_stream
*xdr
= &rqstp
->rq_arg_stream
;
920 struct svc_cred
*cred
= &rqstp
->rq_cred
;
921 struct user_namespace
*userns
;
927 * This implementation ignores the length of the Call's
928 * credential body field and the timestamp and machinename
931 p
= xdr_inline_decode(xdr
, XDR_UNIT
* 3);
934 len
= be32_to_cpup(p
+ 2);
935 if (len
> RPC_MAX_MACHINENAME
)
937 if (!xdr_inline_decode(xdr
, len
))
941 * Note: we skip uid_valid()/gid_valid() checks here for
942 * backwards compatibility with clients that use -1 id's.
943 * Instead, -1 uid or gid is later mapped to the
944 * (export-specific) anonymous id by nfsd_setuser.
945 * Supplementary gid's will be left alone.
947 userns
= (rqstp
->rq_xprt
&& rqstp
->rq_xprt
->xpt_cred
) ?
948 rqstp
->rq_xprt
->xpt_cred
->user_ns
: &init_user_ns
;
949 if (xdr_stream_decode_u32(xdr
, &i
) < 0)
951 cred
->cr_uid
= make_kuid(userns
, i
);
952 if (xdr_stream_decode_u32(xdr
, &i
) < 0)
954 cred
->cr_gid
= make_kgid(userns
, i
);
956 if (xdr_stream_decode_u32(xdr
, &len
) < 0)
958 if (len
> UNX_NGROUPS
)
960 p
= xdr_inline_decode(xdr
, XDR_UNIT
* len
);
963 cred
->cr_group_info
= groups_alloc(len
);
964 if (cred
->cr_group_info
== NULL
)
966 for (i
= 0; i
< len
; i
++) {
967 kgid_t kgid
= make_kgid(userns
, be32_to_cpup(p
++));
968 cred
->cr_group_info
->gid
[i
] = kgid
;
970 groups_sort(cred
->cr_group_info
);
972 /* Call's verf field: */
973 if (xdr_stream_decode_opaque_auth(xdr
, &flavor
, &body
, &len
) < 0)
975 if (flavor
!= RPC_AUTH_NULL
|| len
!= 0) {
976 rqstp
->rq_auth_stat
= rpc_autherr_badverf
;
980 if (xdr_stream_encode_opaque_auth(&rqstp
->rq_res_stream
,
981 RPC_AUTH_NULL
, NULL
, 0) < 0)
983 if (!svcxdr_set_accept_stat(rqstp
))
986 rqstp
->rq_cred
.cr_flavor
= RPC_AUTH_UNIX
;
990 rqstp
->rq_auth_stat
= rpc_autherr_badcred
;
995 svcauth_unix_release(struct svc_rqst
*rqstp
)
997 /* Verifier (such as it is) is already in place.
999 if (rqstp
->rq_client
)
1000 auth_domain_put(rqstp
->rq_client
);
1001 rqstp
->rq_client
= NULL
;
1002 if (rqstp
->rq_cred
.cr_group_info
)
1003 put_group_info(rqstp
->rq_cred
.cr_group_info
);
1004 rqstp
->rq_cred
.cr_group_info
= NULL
;
1010 struct auth_ops svcauth_unix
= {
1012 .owner
= THIS_MODULE
,
1013 .flavour
= RPC_AUTH_UNIX
,
1014 .accept
= svcauth_unix_accept
,
1015 .release
= svcauth_unix_release
,
1016 .domain_release
= svcauth_unix_domain_release
,
1017 .set_client
= svcauth_unix_set_client
,
1020 static const struct cache_detail ip_map_cache_template
= {
1021 .owner
= THIS_MODULE
,
1022 .hash_size
= IP_HASHMAX
,
1023 .name
= "auth.unix.ip",
1024 .cache_put
= ip_map_put
,
1025 .cache_upcall
= ip_map_upcall
,
1026 .cache_request
= ip_map_request
,
1027 .cache_parse
= ip_map_parse
,
1028 .cache_show
= ip_map_show
,
1029 .match
= ip_map_match
,
1030 .init
= ip_map_init
,
1032 .alloc
= ip_map_alloc
,
1035 int ip_map_cache_create(struct net
*net
)
1037 struct sunrpc_net
*sn
= net_generic(net
, sunrpc_net_id
);
1038 struct cache_detail
*cd
;
1041 cd
= cache_create_net(&ip_map_cache_template
, net
);
1044 err
= cache_register_net(cd
, net
);
1046 cache_destroy_net(cd
, net
);
1049 sn
->ip_map_cache
= cd
;
1053 void ip_map_cache_destroy(struct net
*net
)
1055 struct sunrpc_net
*sn
= net_generic(net
, sunrpc_net_id
);
1056 struct cache_detail
*cd
= sn
->ip_map_cache
;
1058 sn
->ip_map_cache
= NULL
;
1060 cache_unregister_net(cd
, net
);
1061 cache_destroy_net(cd
, net
);