ReactOS  0.4.12-dev-918-g6c6e7b8
svc_auth_unix.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009, Sun Microsystems, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * - Redistributions of source code must retain the above copyright notice,
8  * this list of conditions and the following disclaimer.
9  * - Redistributions in binary form must reproduce the above copyright notice,
10  * this list of conditions and the following disclaimer in the documentation
11  * and/or other materials provided with the distribution.
12  * - Neither the name of Sun Microsystems, Inc. nor the names of its
13  * contributors may be used to endorse or promote products derived
14  * from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 /*
30  * svc_auth_unix.c
31  * Handles UNIX flavor authentication parameters on the service side of rpc.
32  * There are two svc auth implementations here: AUTH_UNIX and AUTH_SHORT.
33  * _svcauth_unix does full blown unix style uid,gid+gids auth,
34  * _svcauth_short uses a shorthand auth to index into a cache of longhand auths.
35  * Note: the shorthand has been gutted for efficiency.
36  *
37  * Copyright (C) 1984, Sun Microsystems, Inc.
38  */
39 #include <wintirpc.h>
40 //#include <pthread.h>
41 #include <assert.h>
42 #include <stdio.h>
43 #include <string.h>
44 
45 #include <rpc/rpc.h>
46 
47 /*
48  * Unix longhand authenticator
49  */
50 enum auth_stat
52  struct svc_req *rqst;
53  struct rpc_msg *msg;
54 {
55  enum auth_stat stat;
56  XDR xdrs;
57  struct authunix_parms *aup;
58  int32_t *buf;
59  struct area {
60  struct authunix_parms area_aup;
61  char area_machname[MAX_MACHINE_NAME+1];
62  gid_t area_gids[NGRPS];
63  } *area;
64  u_int auth_len;
65  size_t str_len, gid_len;
66  u_int i;
67 
68  assert(rqst != NULL);
69  assert(msg != NULL);
70 
71  area = (struct area *) rqst->rq_clntcred;
72  aup = &area->area_aup;
73  aup->aup_machname = area->area_machname;
74  aup->aup_gids = area->area_gids;
75  auth_len = (u_int)msg->rm_call.cb_cred.oa_length;
76  xdrmem_create(&xdrs, msg->rm_call.cb_cred.oa_base, auth_len,XDR_DECODE);
77  buf = XDR_INLINE(&xdrs, auth_len);
78  if (buf != NULL) {
79  aup->aup_time = IXDR_GET_INT32(buf);
81  if (str_len > MAX_MACHINE_NAME) {
83  goto done;
84  }
86  aup->aup_machname[str_len] = 0;
88  buf += str_len / sizeof (int32_t);
89  aup->aup_uid = (int)IXDR_GET_INT32(buf);
90  aup->aup_gid = (int)IXDR_GET_INT32(buf);
91  gid_len = (size_t)IXDR_GET_U_INT32(buf);
92  if (gid_len > NGRPS) {
94  goto done;
95  }
96  aup->aup_len = gid_len;
97  for (i = 0; i < gid_len; i++) {
98  aup->aup_gids[i] = (int)IXDR_GET_INT32(buf);
99  }
100  /*
101  * five is the smallest unix credentials structure -
102  * timestamp, hostname len (0), uid, gid, and gids len (0).
103  */
104  if ((5 + gid_len) * BYTES_PER_XDR_UNIT + str_len > auth_len) {
105  (void) printf("bad auth_len gid %ld str %ld auth %u\n",
106  (long)gid_len, (long)str_len, auth_len);
107  stat = AUTH_BADCRED;
108  goto done;
109  }
110  } else if (! xdr_authunix_parms(&xdrs, aup)) {
111  xdrs.x_op = XDR_FREE;
112  (void)xdr_authunix_parms(&xdrs, aup);
113  stat = AUTH_BADCRED;
114  goto done;
115  }
116 
117  /* get the verifier */
118  if ((u_int)msg->rm_call.cb_verf.oa_length) {
119  rqst->rq_xprt->xp_verf.oa_flavor =
120  msg->rm_call.cb_verf.oa_flavor;
121  rqst->rq_xprt->xp_verf.oa_base =
122  msg->rm_call.cb_verf.oa_base;
123  rqst->rq_xprt->xp_verf.oa_length =
124  msg->rm_call.cb_verf.oa_length;
125  } else {
126  rqst->rq_xprt->xp_verf.oa_flavor = AUTH_NULL;
127  rqst->rq_xprt->xp_verf.oa_length = 0;
128  }
129  stat = AUTH_OK;
130 done:
131  XDR_DESTROY(&xdrs);
132  return (stat);
133 }
134 
135 
136 /*
137  * Shorthand unix authenticator
138  * Looks up longhand in a cache.
139  */
140 /*ARGSUSED*/
141 enum auth_stat
143  struct svc_req *rqst;
144  struct rpc_msg *msg;
145 {
146  return (AUTH_REJECTEDCRED);
147 }
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
bool_t xdr_authunix_parms(XDR *xdrs, struct authunix_parms *p)
Definition: authunix_prot.c:50
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
#define int32_t
Definition: nsiface.idl:56
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
void * rq_clntcred
Definition: svc.h:138
#define IXDR_GET_INT32(buf)
Definition: rpcb_prot.h:12
#define str_len
Definition: treelist.c:89
#define assert(x)
Definition: debug.h:53
char * aup_machname
Definition: auth_unix.h:61
#define IXDR_GET_U_INT32(buf)
Definition: rpcb_prot.h:18
gid_t aup_gid
Definition: auth_unix.h:63
enum auth_stat _svcauth_unix(struct svc_req *rqst, struct rpc_msg *msg)
Definition: svc_auth_unix.c:51
Definition: xdr.h:103
SVCXPRT * rq_xprt
Definition: svc.h:139
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
UINT gid_t
Definition: types.h:89
auth_stat
Definition: auth.h:144
Definition: auth.h:145
smooth NULL
Definition: ftsmooth.c:416
uid_t aup_uid
Definition: auth_unix.h:62
u_int aup_len
Definition: auth_unix.h:64
__kernel_size_t size_t
Definition: linux.h:237
enum xdr_op x_op
Definition: xdr.h:104
#define AUTH_NULL
Definition: auth.h:402
gid_t * aup_gids
Definition: auth_unix.h:65
Definition: stat.h:55
#define RNDUP(x)
Definition: xdr.h:94
#define XDR_INLINE(xdrs, len)
Definition: xdr.h:209
INT32 int32_t
Definition: types.h:71
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
Definition: stat.h:345
UINT32 u_int
Definition: types.h:82
enum auth_stat _svcauth_short(struct svc_req *rqst, struct rpc_msg *msg)
Definition: svc.h:132
#define long
Definition: qsort.c:33
static Real area(Real A[2], Real B[2], Real C[2])
Definition: polyDBG.cc:50
void xdrmem_create(XDR *xdrs, char *addr, u_int size, enum xdr_op op)
Definition: xdr_mem.c:94
#define msg(x)
Definition: auth_time.c:54
#define MAX_MACHINE_NAME
Definition: auth_unix.h:51
Definition: xdr.h:87
struct opaque_auth xp_verf
Definition: svc.h:121
Definition: xdr.h:86
#define NGRPS
Definition: auth_unix.h:54
u_long aup_time
Definition: auth_unix.h:60
#define XDR_DESTROY(xdrs)
Definition: xdr.h:214
#define printf
Definition: config.h:203
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
#define BYTES_PER_XDR_UNIT
Definition: xdr.h:93