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

FreeBSD/Linux Kernel Cross Reference
sys/rpc/authunix_prot.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 /*      $NetBSD: authunix_prot.c,v 1.12 2000/01/22 22:19:17 mycroft Exp $       */
  2 
  3 /*
  4  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  5  * unrestricted use provided that this legend is included on all tape
  6  * media and as a part of the software program in whole or part.  Users
  7  * may copy or modify Sun RPC without charge, but are not authorized
  8  * to license or distribute it to anyone else except as part of a product or
  9  * program developed by the user.
 10  *
 11  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
 12  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
 13  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
 14  *
 15  * Sun RPC is provided with no support and without any obligation on the
 16  * part of Sun Microsystems, Inc. to assist in its use, correction,
 17  * modification or enhancement.
 18  *
 19  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
 20  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
 21  * OR ANY PART THEREOF.
 22  *
 23  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
 24  * or profits or other special, indirect and consequential damages, even if
 25  * Sun has been advised of the possibility of such damages.
 26  *
 27  * Sun Microsystems, Inc.
 28  * 2550 Garcia Avenue
 29  * Mountain View, California  94043
 30  */
 31 
 32 #if defined(LIBC_SCCS) && !defined(lint)
 33 static char *sccsid2 = "@(#)authunix_prot.c 1.15 87/08/11 Copyr 1984 Sun Micro";
 34 static char *sccsid = "@(#)authunix_prot.c      2.1 88/07/29 4.0 RPCSRC";
 35 #endif
 36 #include <sys/cdefs.h>
 37 __FBSDID("$FreeBSD: src/sys/rpc/authunix_prot.c,v 1.6 2008/10/02 15:37:58 zec Exp $");
 38 
 39 /*
 40  * authunix_prot.c
 41  * XDR for UNIX style authentication parameters for RPC
 42  *
 43  * Copyright (C) 1984, Sun Microsystems, Inc.
 44  */
 45 
 46 #include <sys/param.h>
 47 #include <sys/kernel.h>
 48 #include <sys/lock.h>
 49 #include <sys/mutex.h>
 50 #include <sys/systm.h>
 51 #include <sys/ucred.h>
 52 #include <sys/vimage.h>
 53 
 54 #include <rpc/types.h>
 55 #include <rpc/xdr.h>
 56 #include <rpc/auth.h>
 57 
 58 #include <rpc/rpc_com.h>
 59 
 60 /* gids compose part of a credential; there may not be more than 16 of them */
 61 #define NGRPS 16
 62 
 63 /*
 64  * XDR for unix authentication parameters.
 65  */
 66 bool_t
 67 xdr_authunix_parms(XDR *xdrs, uint32_t *time, struct xucred *cred)
 68 {
 69         uint32_t namelen;
 70         uint32_t ngroups, i;
 71         uint32_t junk;
 72         INIT_VPROCG(TD_TO_VPROCG(&thread0)); /* XXX revisit - fixme! */
 73 
 74         mtx_lock(&hostname_mtx);
 75         if (xdrs->x_op == XDR_ENCODE) {
 76                 /*
 77                  * Restrict name length to 255 according to RFC 1057.
 78                  */
 79                 namelen = strlen(V_hostname);
 80                 if (namelen > 255)
 81                         namelen = 255;
 82         } else {
 83                 namelen = 0;
 84         }
 85         junk = 0;
 86 
 87         if (!xdr_uint32_t(xdrs, time)
 88             || !xdr_uint32_t(xdrs, &namelen))
 89                 return (FALSE);
 90 
 91         /*
 92          * Ignore the hostname on decode.
 93          */
 94         if (xdrs->x_op == XDR_ENCODE) {
 95                 if (!xdr_opaque(xdrs, V_hostname, namelen))
 96                         return (FALSE);
 97         } else {
 98                 xdr_setpos(xdrs, xdr_getpos(xdrs) + RNDUP(namelen));
 99         }
100         mtx_unlock(&hostname_mtx);
101 
102         if (!xdr_uint32_t(xdrs, &cred->cr_uid))
103                 return (FALSE);
104         if (!xdr_uint32_t(xdrs, &cred->cr_groups[0]))
105                 return (FALSE);
106 
107         if (xdrs->x_op == XDR_ENCODE) {
108                 ngroups = cred->cr_ngroups - 1;
109                 if (ngroups > NGRPS)
110                         ngroups = NGRPS;
111         }
112 
113         if (!xdr_uint32_t(xdrs, &ngroups))
114                 return (FALSE);
115         for (i = 0; i < ngroups; i++) {
116                 if (i + 1 < NGROUPS) {
117                         if (!xdr_uint32_t(xdrs, &cred->cr_groups[i + 1]))
118                                 return (FALSE);
119                 } else {
120                         if (!xdr_uint32_t(xdrs, &junk))
121                                 return (FALSE);
122                 }
123         }
124 
125         if (xdrs->x_op == XDR_DECODE) {
126                 if (ngroups + 1 > NGROUPS)
127                         cred->cr_ngroups = NGROUPS;
128                 else
129                         cred->cr_ngroups = ngroups + 1;
130         }
131 
132         return (TRUE);
133 }
134 

[ 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.