[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]

FreeBSD/Linux Kernel Cross Reference
sys/rpc/svc_auth_unix.c

Version: -  FREEBSD  -  FREEBSD7  -  FREEBSD70  -  FREEBSD6  -  FREEBSD63  -  FREEBSD62  -  FREEBSD61  -  FREEBSD60  -  FREEBSD5  -  FREEBSD55  -  FREEBSD54  -  FREEBSD53  -  FREEBSD52  -  FREEBSD51  -  FREEBSD50  -  FREEBSD4  -  FREEBSD3  -  FREEBSD22  -  linux-2.6  -  linux-2.4.22  -  MK83  -  MK84  -  PLAN9  -  DFBSD  -  NETBSD  -  NETBSD4  -  NETBSD3  -  NETBSD20  -  OPENBSD  -  xnu-517  -  xnu-792  -  xnu-792.6.70  -  xnu-1228  -  OPENSOLARIS  -  minix-3-1-1  -  TRUSTEDBSD-SEBSD  -  FREEBSD-LIBC  -  FREEBSD7-LIBC  -  FREEBSD6-LIBC  -  GLIBC27 
SearchContext: -  none  -  excerpts  -  bigexcerpts 

  1 /*
  2  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  3  * unrestricted use provided that this legend is included on all tape
  4  * media and as a part of the software program in whole or part.  Users
  5  * may copy or modify Sun RPC without charge, but are not authorized
  6  * to license or distribute it to anyone else except as part of a product or
  7  * program developed by the user.
  8  *
  9  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
 10  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
 11  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
 12  *
 13  * Sun RPC is provided with no support and without any obligation on the
 14  * part of Sun Microsystems, Inc. to assist in its use, correction,
 15  * modification or enhancement.
 16  *
 17  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
 18  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
 19  * OR ANY PART THEREOF.
 20  *
 21  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
 22  * or profits or other special, indirect and consequential damages, even if
 23  * Sun has been advised of the possibility of such damages.
 24  *
 25  * Sun Microsystems, Inc.
 26  * 2550 Garcia Avenue
 27  * Mountain View, California  94043
 28  */
 29 
 30 #if defined(LIBC_SCCS) && !defined(lint)
 31 static char *sccsid2 = "@(#)svc_auth_unix.c 1.28 88/02/08 Copyr 1984 Sun Micro";
 32 static char *sccsid = "@(#)svc_auth_unix.c      2.3 88/08/01 4.0 RPCSRC";
 33 #endif
 34 #include <sys/cdefs.h>
 35 __FBSDID("$FreeBSD: src/sys/rpc/svc_auth_unix.c,v 1.3 2008/11/03 10:38:00 dfr Exp $");
 36 
 37 /*
 38  * svc_auth_unix.c
 39  * Handles UNIX flavor authentication parameters on the service side of rpc.
 40  * There are two svc auth implementations here: AUTH_UNIX and AUTH_SHORT.
 41  * _svcauth_unix does full blown unix style uid,gid+gids auth,
 42  * _svcauth_short uses a shorthand auth to index into a cache of longhand auths.
 43  * Note: the shorthand has been gutted for efficiency.
 44  *
 45  * Copyright (C) 1984, Sun Microsystems, Inc.
 46  */
 47 
 48 #include <sys/param.h>
 49 #include <sys/lock.h>
 50 #include <sys/mutex.h>
 51 #include <sys/systm.h>
 52 #include <sys/ucred.h>
 53 
 54 #include <rpc/rpc.h>
 55 
 56 #include <rpc/rpc_com.h>
 57 
 58 #define MAX_MACHINE_NAME        255
 59 #define NGRPS                   16
 60 
 61 /*
 62  * Unix longhand authenticator
 63  */
 64 enum auth_stat
 65 _svcauth_unix(struct svc_req *rqst, struct rpc_msg *msg)
 66 {
 67         enum auth_stat stat;
 68         XDR xdrs;
 69         int32_t *buf;
 70         uint32_t time;
 71         struct xucred *xcr;
 72         u_int auth_len;
 73         size_t str_len, gid_len;
 74         u_int i;
 75 
 76         xcr = rqst->rq_clntcred;
 77         auth_len = (u_int)msg->rm_call.cb_cred.oa_length;
 78         xdrmem_create(&xdrs, msg->rm_call.cb_cred.oa_base, auth_len,
 79             XDR_DECODE);
 80         buf = XDR_INLINE(&xdrs, auth_len);
 81         if (buf != NULL) {
 82                 time = IXDR_GET_UINT32(buf);
 83                 str_len = (size_t)IXDR_GET_UINT32(buf);
 84                 if (str_len > MAX_MACHINE_NAME) {
 85                         stat = AUTH_BADCRED;
 86                         goto done;
 87                 }
 88                 str_len = RNDUP(str_len);
 89                 buf += str_len / sizeof (int32_t);
 90                 xcr->cr_uid = IXDR_GET_UINT32(buf);
 91                 xcr->cr_groups[0] = IXDR_GET_UINT32(buf);
 92                 gid_len = (size_t)IXDR_GET_UINT32(buf);
 93                 if (gid_len > NGRPS) {
 94                         stat = AUTH_BADCRED;
 95                         goto done;
 96                 }
 97                 for (i = 0; i < gid_len; i++) {
 98                         if (i + 1 < NGROUPS)
 99                                 xcr->cr_groups[i + 1] = IXDR_GET_INT32(buf);
100                         else
101                                 buf++;
102                 }
103                 if (gid_len + 1 > NGROUPS)
104                         xcr->cr_ngroups = NGROUPS;
105                 else
106                         xcr->cr_ngroups = gid_len + 1;
107 
108                 /*
109                  * five is the smallest unix credentials structure -
110                  * timestamp, hostname len (0), uid, gid, and gids len (0).
111                  */
112                 if ((5 + gid_len) * BYTES_PER_XDR_UNIT + str_len > auth_len) {
113                         (void) printf("bad auth_len gid %ld str %ld auth %u\n",
114                             (long)gid_len, (long)str_len, auth_len);
115                         stat = AUTH_BADCRED;
116                         goto done;
117                 }
118         } else if (! xdr_authunix_parms(&xdrs, &time, xcr)) {
119                 stat = AUTH_BADCRED;
120                 goto done;
121         }
122 
123         rqst->rq_verf = _null_auth;
124         stat = AUTH_OK;
125 done:
126         XDR_DESTROY(&xdrs);
127 
128         return (stat);
129 }
130 
131 
132 /*
133  * Shorthand unix authenticator
134  * Looks up longhand in a cache.
135  */
136 /*ARGSUSED*/
137 enum auth_stat 
138 _svcauth_short(rqst, msg)
139         struct svc_req *rqst;
140         struct rpc_msg *msg;
141 {
142         return (AUTH_REJECTEDCRED);
143 }
144 

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.