fix CVE-2007-5902: integer overflow in svcauth_gss_get_principal()
[krb5.git] / src / lib / rpc / unit-test / rpc_test_svc.c
1 #include "rpc_test.h"
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdlib.h> /* getenv, exit */
5 #include <sys/types.h>
6 #include <syslog.h>
7
8 /* States a server can be in wrt request */
9
10 #define _IDLE 0
11 #define _SERVED 1
12
13 static int _rpcsvcstate = _IDLE;        /* Set when a request is serviced */
14 static int _rpcsvccount = 0;            /* Number of requests being serviced */
15
16 static
17 void _msgout(msg)
18         char *msg;
19 {
20         syslog(LOG_ERR, msg);
21 }
22
23 void
24 rpc_test_prog_1_svc(rqstp, transp)
25         struct svc_req *rqstp;
26         register SVCXPRT *transp;
27 {
28         union {
29                 char *rpc_test_echo_1_arg;
30         } argument;
31         char *result;
32         bool_t (*xdr_argument)(), (*xdr_result)();
33         char *(*local)();
34
35         _rpcsvccount++;
36         switch (rqstp->rq_proc) {
37         case NULLPROC:
38                 (void) svc_sendreply(transp, xdr_void,
39                         (char *)NULL);
40                 _rpcsvccount--;
41                 _rpcsvcstate = _SERVED;
42                 return;
43
44         case RPC_TEST_ECHO:
45                 xdr_argument = xdr_wrapstring;
46                 xdr_result = xdr_wrapstring;
47                 local = (char *(*)()) rpc_test_echo_1_svc;
48                 break;
49
50         default:
51                 svcerr_noproc(transp);
52                 _rpcsvccount--;
53                 _rpcsvcstate = _SERVED;
54                 return;
55         }
56         (void) memset((char *)&argument, 0, sizeof (argument));
57         if (!svc_getargs(transp, xdr_argument, &argument)) {
58                 svcerr_decode(transp);
59                 _rpcsvccount--;
60                 _rpcsvcstate = _SERVED;
61                 return;
62         }
63         result = (*local)(&argument, rqstp);
64         if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
65                 svcerr_systemerr(transp);
66         }
67         if (!svc_freeargs(transp, xdr_argument, &argument)) {
68                 _msgout("unable to free arguments");
69                 exit(1);
70         }
71         _rpcsvccount--;
72         _rpcsvcstate = _SERVED;
73         return;
74 }