diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-07-12 18:26:36 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2007-07-12 18:26:36 +0000 |
commit | 0ecb606cb6cf65de1d9fc8a919bceb4be476c602 (patch) | |
tree | 2ea1f8305970753e4a657acb2ccc15ca3eec8e2c /sunrpc | |
parent | 7d58530341304d403a6626d7f7a1913165fe2f32 (diff) | |
download | glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar.gz |
2.5-18.1
Diffstat (limited to 'sunrpc')
46 files changed, 580 insertions, 417 deletions
diff --git a/sunrpc/Makefile b/sunrpc/Makefile index 284e355cc3..30f74dc135 100644 --- a/sunrpc/Makefile +++ b/sunrpc/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1994-2001, 2002, 2003, 2004 Free Software Foundation, Inc. +# Copyright (C) 1994-2004, 2005, 2006 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or @@ -85,6 +85,7 @@ all: # Make this the default target; it will be defined in Rules. include ../Makeconfig +tests = tst-xdrmem tst-xdrmem2 xtests := tst-getmyaddr ifeq ($(have-thread-library),yes) @@ -107,28 +108,25 @@ librpcsvc-inhibit-o = .os # Build no shared rpcsvc library. omit-deps = $(librpcsvc-routines) endif -CFLAGS-xbootparam_prot.c = -Wno-unused -CFLAGS-xnlm_prot.c = -Wno-unused -CFLAGS-xrstat.c = -Wno-unused -CFLAGS-xyppasswd.c = -Wno-unused -CFLAGS-xklm_prot.c = -Wno-unused -CFLAGS-xrex.c = -Wno-unused -CFLAGS-xsm_inter.c = -Wno-unused -CFLAGS-xmount.c = -Wno-unused -CFLAGS-xrusers.c = -Wno-unused -CFLAGS-xspray.c = -Wno-unused -CFLAGS-xnfs_prot.c = -Wno-unused -CFLAGS-xrquota.c = -Wno-unused -CFLAGS-xkey_prot.c = -Wno-unused +CFLAGS-xbootparam_prot.c = -Wno-unused $(PIC-ccflag) +CFLAGS-xnlm_prot.c = -Wno-unused $(PIC-ccflag) +CFLAGS-xrstat.c = -Wno-unused $(PIC-ccflag) +CFLAGS-xyppasswd.c = -Wno-unused $(PIC-ccflag) +CFLAGS-xklm_prot.c = -Wno-unused $(PIC-ccflag) +CFLAGS-xrex.c = -Wno-unused $(PIC-ccflag) +CFLAGS-xsm_inter.c = -Wno-unused $(PIC-ccflag) +CFLAGS-xmount.c = -Wno-unused $(PIC-ccflag) +CFLAGS-xrusers.c = -Wno-unused $(PIC-ccflag) +CFLAGS-xspray.c = -Wno-unused $(PIC-ccflag) +CFLAGS-xnfs_prot.c = -Wno-unused $(PIC-ccflag) +CFLAGS-xrquota.c = -Wno-unused $(PIC-ccflag) +CFLAGS-xkey_prot.c = -Wno-unused $(PIC-ccflag) CFLAGS-auth_unix.c = -fexceptions CFLAGS-key_call.c = -fexceptions CFLAGS-pmap_rmt.c = -fexceptions CFLAGS-clnt_perr.c = -fexceptions CFLAGS-openchild.c = -fexceptions -ifeq (yes,$(have_doors)) -CPPFLAGS-key_call.c += -DHAVE_DOORS=1 -endif CPPFLAGS += -D_RPC_THREAD_SAFE_ include ../Rules diff --git a/sunrpc/auth_des.c b/sunrpc/auth_des.c index fc5956dcd7..a76f0278ce 100644 --- a/sunrpc/auth_des.c +++ b/sunrpc/auth_des.c @@ -66,7 +66,7 @@ static void authdes_destroy (AUTH *); static bool_t synchronize (struct sockaddr *, struct rpc_timeval *) internal_function; -static struct auth_ops authdes_ops = { +static const struct auth_ops authdes_ops = { authdes_nextverf, authdes_marshal, authdes_validate, @@ -107,14 +107,14 @@ authdes_create (const char *servername, u_int window, /* syncaddr - optional addr of host to sync with */ /* ckey - optional conversation key to use */ { - u_char pkey_data[1024]; + char pkey_data[1024]; netobj pkey; if (!getpublickey (servername, pkey_data)) return NULL; - pkey.n_bytes = (char *) pkey_data; - pkey.n_len = strlen ((char *) pkey_data) + 1; + pkey.n_bytes = pkey_data; + pkey.n_len = strlen (pkey_data) + 1; return INTUSE(authdes_pk_create) (servername, &pkey, window, syncaddr, ckey); } @@ -174,7 +174,7 @@ authdes_pk_create (const char *servername, netobj *pkey, u_int window, if (key_gendes (&auth->ah_key) < 0) { debug ("authdes_create: unable to gen conversation key"); - return NULL; + goto failed; } } else @@ -185,7 +185,7 @@ authdes_pk_create (const char *servername, netobj *pkey, u_int window, */ auth->ah_cred.oa_flavor = AUTH_DES; auth->ah_verf.oa_flavor = AUTH_DES; - auth->ah_ops = &authdes_ops; + auth->ah_ops = (struct auth_ops *) &authdes_ops; auth->ah_private = (caddr_t) ad; if (!authdes_refresh (auth)) @@ -237,7 +237,7 @@ authdes_marshal (AUTH *auth, XDR *xdrs) des_block cryptbuf[2]; des_block ivec; int status; - unsigned int len; + int len; register int32_t *ixdr; struct timeval tval; diff --git a/sunrpc/auth_none.c b/sunrpc/auth_none.c index 9c4d3fde66..f459520a2c 100644 --- a/sunrpc/auth_none.c +++ b/sunrpc/auth_none.c @@ -49,7 +49,7 @@ static bool_t authnone_marshal (AUTH *, XDR *); static bool_t authnone_validate (AUTH *, struct opaque_auth *); static bool_t authnone_refresh (AUTH *); -static struct auth_ops ops = { +static const struct auth_ops ops = { authnone_verf, authnone_marshal, authnone_validate, @@ -80,7 +80,7 @@ authnone_create_once (void) ap = &authnone_private; ap->no_client.ah_cred = ap->no_client.ah_verf = _null_auth; - ap->no_client.ah_ops = &ops; + ap->no_client.ah_ops = (struct auth_ops *) &ops; xdrs = &xdr_stream; INTUSE(xdrmem_create) (xdrs, ap->marshalled_client, (u_int) MAX_MARSHAL_SIZE, XDR_ENCODE); @@ -88,7 +88,7 @@ authnone_create_once (void) (void) INTUSE(xdr_opaque_auth) (xdrs, &ap->no_client.ah_verf); ap->mcnt = XDR_GETPOS (xdrs); XDR_DESTROY (xdrs); -} +} AUTH * authnone_create (void) diff --git a/sunrpc/auth_unix.c b/sunrpc/auth_unix.c index 1cf18cb6b3..1740e58cdc 100644 --- a/sunrpc/auth_unix.c +++ b/sunrpc/auth_unix.c @@ -65,7 +65,7 @@ static bool_t authunix_validate (AUTH *, struct opaque_auth *); static bool_t authunix_refresh (AUTH *); static void authunix_destroy (AUTH *); -static struct auth_ops auth_unix_ops = { +static const struct auth_ops auth_unix_ops = { authunix_nextverf, authunix_marshal, authunix_validate, @@ -111,18 +111,12 @@ authunix_create (char *machname, uid_t uid, gid_t gid, int len, if (auth == NULL || au == NULL) { no_memory: -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("authunix_create: out of memory\n")); - else -#endif - (void) fputs (_("authunix_create: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("authunix_create: out of memory\n")); mem_free (auth, sizeof (*auth)); mem_free (au, sizeof (*au)); return NULL; } - auth->ah_ops = &auth_unix_ops; + auth->ah_ops = (struct auth_ops *) &auth_unix_ops; auth->ah_private = (caddr_t) au; auth->ah_verf = au->au_shcred = _null_auth; au->au_shfaults = 0; diff --git a/sunrpc/bindrsvprt.c b/sunrpc/bindrsvprt.c index 374518716e..023ae1723b 100644 --- a/sunrpc/bindrsvprt.c +++ b/sunrpc/bindrsvprt.c @@ -43,14 +43,15 @@ int bindresvport (int sd, struct sockaddr_in *sin) { - int res; static short port; struct sockaddr_in myaddr; int i; #define STARTPORT 600 +#define LOWPORT 512 #define ENDPORT (IPPORT_RESERVED - 1) #define NPORTS (ENDPORT - STARTPORT + 1) + static short startport = STARTPORT; if (sin == (struct sockaddr_in *) 0) { @@ -68,17 +69,30 @@ bindresvport (int sd, struct sockaddr_in *sin) { port = (__getpid () % NPORTS) + STARTPORT; } - res = -1; - __set_errno (EADDRINUSE); - for (i = 0; i < NPORTS && res < 0 && errno == EADDRINUSE; ++i) + /* Initialize to make gcc happy. */ + int res = -1; + + int nports = ENDPORT - startport + 1; + int endport = ENDPORT; + again: + for (i = 0; i < nports; ++i) { sin->sin_port = htons (port++); - if (port > ENDPORT) - { - port = STARTPORT; - } + if (port > endport) + port = startport; res = __bind (sd, sin, sizeof (struct sockaddr_in)); + if (res >= 0 || errno != EADDRINUSE) + break; + } + + if (i == nports && startport != LOWPORT) + { + startport = LOWPORT; + endport = STARTPORT - 1; + nports = STARTPORT - LOWPORT; + port = LOWPORT + port % (STARTPORT - LOWPORT); + goto again; } return res; diff --git a/sunrpc/clnt_perr.c b/sunrpc/clnt_perr.c index 4fa5e62c0f..6446b32740 100644 --- a/sunrpc/clnt_perr.c +++ b/sunrpc/clnt_perr.c @@ -155,12 +155,7 @@ libc_hidden_def (clnt_sperror) void clnt_perror (CLIENT * rpch, const char *msg) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", clnt_sperror (rpch, msg)); - else -#endif - (void) fputs (clnt_sperror (rpch, msg), stderr); + (void) __fxprintf (NULL, "%s", clnt_sperror (rpch, msg)); } libc_hidden_def (clnt_perror) @@ -289,12 +284,7 @@ libc_hidden_def (clnt_sperrno) void clnt_perrno (enum clnt_stat num) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", clnt_sperrno (num)); - else -#endif - (void) fputs (clnt_sperrno (num), stderr); + (void) __fxprintf (NULL, "%s", clnt_sperrno (num)); } @@ -337,12 +327,7 @@ libc_hidden_def (clnt_spcreateerror) void clnt_pcreateerror (const char *msg) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", clnt_spcreateerror (msg)); - else -#endif - (void) fputs (clnt_spcreateerror (msg), stderr); + (void) __fxprintf (NULL, "%s", clnt_spcreateerror (msg)); } struct auth_errtab diff --git a/sunrpc/clnt_raw.c b/sunrpc/clnt_raw.c index e8613422a5..019f1bbae0 100644 --- a/sunrpc/clnt_raw.c +++ b/sunrpc/clnt_raw.c @@ -74,7 +74,7 @@ static bool_t clntraw_freeres (CLIENT *, xdrproc_t, caddr_t); static bool_t clntraw_control (CLIENT *, int, char *); static void clntraw_destroy (CLIENT *); -static struct clnt_ops client_ops = +static const struct clnt_ops client_ops = { clntraw_call, clntraw_abort, @@ -127,7 +127,7 @@ clntraw_create (u_long prog, u_long vers) /* * create client handle */ - client->cl_ops = &client_ops; + client->cl_ops = (struct clnt_ops *) &client_ops; client->cl_auth = INTUSE(authnone_create) (); return client; } diff --git a/sunrpc/clnt_tcp.c b/sunrpc/clnt_tcp.c index 5d02cd99cb..5bec3bcf3a 100644 --- a/sunrpc/clnt_tcp.c +++ b/sunrpc/clnt_tcp.c @@ -91,7 +91,7 @@ static bool_t clnttcp_freeres (CLIENT *, xdrproc_t, caddr_t); static bool_t clnttcp_control (CLIENT *, int, char *); static void clnttcp_destroy (CLIENT *); -static struct clnt_ops tcp_ops = +static const struct clnt_ops tcp_ops = { clnttcp_call, clnttcp_abort, @@ -128,13 +128,7 @@ clnttcp_create (struct sockaddr_in *raddr, u_long prog, u_long vers, if (h == NULL || ct == NULL) { struct rpc_createerr *ce = &get_rpc_createerr (); -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("clnttcp_create: out of memory\n")); - else -#endif - (void) fputs (_("clnttcp_create: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("clnttcp_create: out of memory\n")); ce->cf_stat = RPC_SYSTEMERROR; ce->cf_error.re_errno = ENOMEM; goto fooy; @@ -219,7 +213,7 @@ clnttcp_create (struct sockaddr_in *raddr, u_long prog, u_long vers, */ INTUSE(xdrrec_create) (&(ct->ct_xdrs), sendsz, recvsz, (caddr_t) ct, readtcp, writetcp); - h->cl_ops = &tcp_ops; + h->cl_ops = (struct clnt_ops *) &tcp_ops; h->cl_private = (caddr_t) ct; h->cl_auth = INTUSE(authnone_create) (); return h; diff --git a/sunrpc/clnt_udp.c b/sunrpc/clnt_udp.c index f3787dd1a5..8c24677c83 100644 --- a/sunrpc/clnt_udp.c +++ b/sunrpc/clnt_udp.c @@ -74,7 +74,7 @@ static bool_t clntudp_freeres (CLIENT *, xdrproc_t, caddr_t); static bool_t clntudp_control (CLIENT *, int, char *); static void clntudp_destroy (CLIENT *); -static struct clnt_ops udp_ops = +static const struct clnt_ops udp_ops = { clntudp_call, clntudp_abort, @@ -136,13 +136,7 @@ clntudp_bufcreate (struct sockaddr_in *raddr, u_long program, u_long version, if (cl == NULL || cu == NULL) { struct rpc_createerr *ce = &get_rpc_createerr (); -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("clntudp_create: out of memory\n")); - else -#endif - (void) fputs (_("clntudp_create: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("clntudp_create: out of memory\n")); ce->cf_stat = RPC_SYSTEMERROR; ce->cf_error.re_errno = ENOMEM; goto fooy; @@ -159,7 +153,7 @@ clntudp_bufcreate (struct sockaddr_in *raddr, u_long program, u_long version, } raddr->sin_port = htons (port); } - cl->cl_ops = &udp_ops; + cl->cl_ops = (struct clnt_ops *) &udp_ops; cl->cl_private = (caddr_t) cu; cu->cu_raddr = *raddr; cu->cu_rlen = sizeof (cu->cu_raddr); diff --git a/sunrpc/clnt_unix.c b/sunrpc/clnt_unix.c index fae1cd8229..848a480581 100644 --- a/sunrpc/clnt_unix.c +++ b/sunrpc/clnt_unix.c @@ -88,7 +88,7 @@ static bool_t clntunix_freeres (CLIENT *, xdrproc_t, caddr_t); static bool_t clntunix_control (CLIENT *, int, char *); static void clntunix_destroy (CLIENT *); -static struct clnt_ops unix_ops = +static const struct clnt_ops unix_ops = { clntunix_call, clntunix_abort, @@ -125,13 +125,7 @@ clntunix_create (struct sockaddr_un *raddr, u_long prog, u_long vers, if (h == NULL || ct == NULL) { struct rpc_createerr *ce = &get_rpc_createerr (); -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("clntunix_create: out of memory\n")); - else -#endif - (void) fputs (_("clntunix_create: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("clntunix_create: out of memory\n")); ce->cf_stat = RPC_SYSTEMERROR; ce->cf_error.re_errno = ENOMEM; goto fooy; @@ -198,7 +192,7 @@ clntunix_create (struct sockaddr_un *raddr, u_long prog, u_long vers, */ INTUSE(xdrrec_create) (&(ct->ct_xdrs), sendsz, recvsz, (caddr_t) ct, readunix, writeunix); - h->cl_ops = &unix_ops; + h->cl_ops = (struct clnt_ops *) &unix_ops; h->cl_private = (caddr_t) ct; h->cl_auth = INTUSE(authnone_create) (); return h; diff --git a/sunrpc/create_xid.c b/sunrpc/create_xid.c index 21b83a7656..4e76918644 100644 --- a/sunrpc/create_xid.c +++ b/sunrpc/create_xid.c @@ -33,7 +33,7 @@ static struct drand48_data __rpc_lrand48_data; unsigned long _create_xid (void) { - unsigned long res; + long int res; __libc_lock_lock (createxid_lock); diff --git a/sunrpc/des_impl.c b/sunrpc/des_impl.c index 702bd02c77..dc94e221ab 100644 --- a/sunrpc/des_impl.c +++ b/sunrpc/des_impl.c @@ -6,10 +6,11 @@ /* write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,*/ /* Boston, MA 02111, USA to obtain a copy. */ #include <string.h> +#include <stdint.h> #include "des.h" -static const unsigned long des_SPtrans[8][64] = +static const uint32_t des_SPtrans[8][64] = { { /* nibble 0 */ 0x00820200, 0x00020000, 0x80800000, 0x80820200, @@ -155,7 +156,7 @@ static const unsigned long des_SPtrans[8][64] = 0x00000020, 0x08208000, 0x00208020, 0x00000000, 0x08000000, 0x08200020, 0x00008000, 0x00208020}}; -static const unsigned long des_skb[8][64] = +static const uint32_t des_skb[8][64] = { { /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ 0x00000000, 0x00000010, 0x20000000, 0x20000010, @@ -352,26 +353,6 @@ static const unsigned long des_skb[8][64] = (a)=(a)^(t)^(t>>(16-(n)))) -/* The changes to this macro may help or hinder, depending on the - * compiler and the achitecture. gcc2 always seems to do well :-). - * Inspired by Dana How <how@isl.stanford.edu> - * DO NOT use the alternative version on machines with 8 byte longs. - */ -#ifdef ALT_ECB -#define D_ENCRYPT(L,R,S) \ - u=((R^s[S ])<<2); \ - t= R^s[S+1]; \ - t=((t>>2)+(t<<30)); \ - L^= \ - *(const unsigned long *)(des_SP+0x0100+((t )&0xfc))+ \ - *(const unsigned long *)(des_SP+0x0300+((t>> 8)&0xfc))+ \ - *(const unsigned long *)(des_SP+0x0500+((t>>16)&0xfc))+ \ - *(const unsigned long *)(des_SP+0x0700+((t>>24)&0xfc))+ \ - *(const unsigned long *)(des_SP+ ((u )&0xfc))+ \ - *(const unsigned long *)(des_SP+0x0200+((u>> 8)&0xfc))+ \ - *(const unsigned long *)(des_SP+0x0400+((u>>16)&0xfc))+ \ - *(const unsigned long *)(des_SP+0x0600+((u>>24)&0xfc)); -#else /* original version */ #define D_ENCRYPT(L,R,S) \ u=(R^s[S ]); \ t=R^s[S+1]; \ @@ -384,21 +365,20 @@ static const unsigned long des_skb[8][64] = des_SPtrans[2][(u>> 8)&0x3f]| \ des_SPtrans[4][(u>>16)&0x3f]| \ des_SPtrans[6][(u>>24)&0x3f]; -#endif #define ITERATIONS 16 static const char shifts2[16] = {0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0}; -static void des_set_key (char *, unsigned long *) internal_function; +static void des_set_key (unsigned char *, unsigned long *) internal_function; static void des_encrypt (unsigned long *, unsigned long *, int) internal_function; int _des_crypt (char *, unsigned, struct desparams *); static void internal_function -des_set_key (char *key, unsigned long *schedule) +des_set_key (unsigned char *key, unsigned long *schedule) { register unsigned long c, d, t, s; register unsigned char *in; @@ -406,7 +386,7 @@ des_set_key (char *key, unsigned long *schedule) register int i; k = (unsigned long *) schedule; - in = (unsigned char *) key; + in = key; c2l (in, c); c2l (in, d); @@ -464,9 +444,6 @@ internal_function des_encrypt (unsigned long *buf, unsigned long *schedule, int encrypt) { register unsigned long l, r, t, u; -#ifdef ALT_ECB - register const unsigned char *des_SP = (const unsigned char *) des_SPtrans; -#endif register int i; register unsigned long *s; diff --git a/sunrpc/key_call.c b/sunrpc/key_call.c index 211f61db70..611c37256c 100644 --- a/sunrpc/key_call.c +++ b/sunrpc/key_call.c @@ -51,10 +51,6 @@ #include <rpc/key_prot.h> #include <bits/libc-lock.h> -#ifdef HAVE_DOORS -# include "door/door.h" -#endif - #define KEY_TIMEOUT 5 /* per-try timeout in seconds */ #define KEY_NRETRY 12 /* number of retries */ @@ -386,7 +382,7 @@ getkeyserv_handle (int vers) struct timeval wait_time; int fd; struct sockaddr_un name; - int namelen = sizeof(struct sockaddr_un); + socklen_t namelen = sizeof(struct sockaddr_un); #define TOTAL_TIMEOUT 30 /* total timeout talking to keyserver */ #define TOTAL_TRIES 5 /* Number of tries */ @@ -404,6 +400,7 @@ getkeyserv_handle (int vers) /* if pid has changed, destroy client and rebuild */ if (kcp->client != NULL && kcp->pid != __getpid ()) { + auth_destroy (kcp->client->cl_auth); clnt_destroy (kcp->client); kcp->client = NULL; } @@ -503,73 +500,6 @@ key_call_socket (u_long proc, xdrproc_t xdr_arg, char *arg, return result; } -#ifdef HAVE_DOORS -/* returns 0 on failure, 1 on success */ -static int -internal_function -key_call_door (u_long proc, xdrproc_t xdr_arg, char *arg, - xdrproc_t xdr_rslt, char *rslt) -{ - XDR xdrs; - int fd, ret; - door_arg_t args; - char *data_ptr; - u_long data_len = 0; - char res[255]; - - if ((fd = open("/var/run/keyservdoor", O_RDONLY)) < 0) - return 0; - res[0] = 0; - - data_len = xdr_sizeof (xdr_arg, arg); - data_ptr = calloc (1, data_len + 2 * sizeof (u_long)); - if (data_ptr == NULL) - return 0; - - INTUSE(xdrmem_create) (&xdrs, &data_ptr[2 * sizeof (u_long)], data_len, - XDR_ENCODE); - if (!xdr_arg (&xdrs, arg)) - { - xdr_destroy (&xdrs); - free (data_ptr); - return 0; - } - xdr_destroy (&xdrs); - - memcpy (data_ptr, &proc, sizeof (u_long)); - memcpy (&data_ptr[sizeof (proc)], &data_len, sizeof (u_long)); - - args.data_ptr = data_ptr; - args.data_size = data_len + 2 * sizeof (u_long); - args.desc_ptr = NULL; - args.desc_num = 0; - args.rbuf = res; - args.rsize = sizeof (res); - - ret = __door_call (fd, &args); - free (data_ptr); - close (fd); - - if (ret < 0) - return 0; - - memcpy (&data_len, args.data_ptr, sizeof (u_long)); - if (data_len != 0) - return 0; - - memcpy (&data_len, &args.data_ptr[sizeof (u_long)], sizeof (u_long)); - INTUSE(xdrmem_create) (&xdrs, &args.data_ptr[2 * sizeof (u_long)], - data_len, XDR_DECODE); - if (!xdr_rslt (&xdrs, rslt)) - { - xdr_destroy (&xdrs); - return 0; - } - xdr_destroy (&xdrs); - - return 1; -} -#endif /* returns 0 on failure, 1 on success */ static int @@ -580,9 +510,6 @@ key_call (u_long proc, xdrproc_t xdr_arg, char *arg, #ifndef SO_PASSCRED static int use_keyenvoy; #endif -#ifdef HAVE_DOORS - static int not_use_doors; -#endif if (proc == KEY_ENCRYPT_PK && __key_encryptsession_pk_LOCAL) { @@ -606,15 +533,6 @@ key_call (u_long proc, xdrproc_t xdr_arg, char *arg, return 1; } -#ifdef HAVE_DOORS - if (!not_use_doors) - { - if (key_call_door (proc, xdr_arg, arg, xdr_rslt, rslt)) - return 1; - not_use_doors = 1; - } -#endif - #ifdef SO_PASSCRED return key_call_socket (proc, xdr_arg, arg, xdr_rslt, rslt); #else @@ -635,8 +553,11 @@ __rpc_thread_key_cleanup (void) struct key_call_private *kcp = RPC_THREAD_VARIABLE(key_call_private_s); if (kcp) { - if (kcp->client) + if (kcp->client) { + if (kcp->client->cl_auth) + auth_destroy (kcp->client->cl_auth); clnt_destroy(kcp->client); + } free (kcp); } } diff --git a/sunrpc/openchild.c b/sunrpc/openchild.c index 16f6a34e7a..29ddfa6b75 100644 --- a/sunrpc/openchild.c +++ b/sunrpc/openchild.c @@ -81,7 +81,7 @@ _openchild (const char *command, FILE ** fto, FILE ** ffrom) for (i = _rpc_dtablesize () - 1; i >= 3; i--) __close (i); fflush (stderr); - execlp (command, command, 0); + execlp (command, command, NULL); perror ("exec"); _exit (~0); diff --git a/sunrpc/pm_getmaps.c b/sunrpc/pm_getmaps.c index d1d4ca8769..2a6876d9d8 100644 --- a/sunrpc/pm_getmaps.c +++ b/sunrpc/pm_getmaps.c @@ -44,9 +44,12 @@ static char sccsid[] = "@(#)pmap_getmaps.c 1.10 87/08/11 Copyr 1984 Sun Micro"; #include <rpc/pmap_clnt.h> #include <sys/socket.h> #include <netdb.h> +#include <stdbool.h> #include <stdio.h> #include <errno.h> #include <libintl.h> +#include <unistd.h> + /* * Get a copy of the current port maps. @@ -56,13 +59,19 @@ struct pmaplist * pmap_getmaps (struct sockaddr_in *address) { struct pmaplist *head = (struct pmaplist *) NULL; - int socket = -1; struct timeval minutetimeout; CLIENT *client; + bool closeit = false; minutetimeout.tv_sec = 60; minutetimeout.tv_usec = 0; address->sin_port = htons (PMAPPORT); + + /* Don't need a reserved port to get ports from the portmapper. */ + int socket = __get_socket (address); + if (socket != -1) + closeit = true; + client = INTUSE(clnttcp_create) (address, PMAPPROG, PMAPVERS, &socket, 50, 500); if (client != (CLIENT *) NULL) @@ -75,7 +84,9 @@ pmap_getmaps (struct sockaddr_in *address) } CLNT_DESTROY (client); } - /* (void)close(socket); CLNT_DESTROY already closed it */ + /* We only need to close the socket here if we opened it. */ + if (closeit) + (void) __close (socket); address->sin_port = 0; return head; } diff --git a/sunrpc/pm_getport.c b/sunrpc/pm_getport.c index 00e1ba95bf..2d309841f3 100644 --- a/sunrpc/pm_getport.c +++ b/sunrpc/pm_getport.c @@ -38,6 +38,8 @@ static char sccsid[] = "@(#)pmap_getport.c 1.9 87/08/11 Copyr 1984 Sun Micro"; * Copyright (C) 1984, Sun Microsystems, Inc. */ +#include <stdbool.h> +#include <unistd.h> #include <rpc/rpc.h> #include <rpc/pmap_prot.h> #include <rpc/pmap_clnt.h> @@ -49,6 +51,41 @@ static const struct timeval tottimeout = {60, 0}; /* + * Create a socket that is locally bound to a non-reserve port. For + * any failures, -1 is returned which will cause the RPC code to + * create the socket. + */ +int +internal_function +__get_socket (struct sockaddr_in *saddr) +{ + int so = __socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (so < 0) + return -1; + + struct sockaddr_in laddr; + socklen_t namelen = sizeof (laddr); + laddr.sin_family = AF_INET; + laddr.sin_port = 0; + laddr.sin_addr.s_addr = htonl (INADDR_ANY); + + int cc = __bind (so, (struct sockaddr *) &laddr, namelen); + if (__builtin_expect (cc < 0, 0)) + { + fail: + __close (so); + return -1; + } + + cc = __connect (so, (struct sockaddr *) saddr, namelen); + if (__builtin_expect (cc < 0, 0)) + goto fail; + + return so; +} + + +/* * Find the mapped port for program,version. * Calls the pmap service remotely to do the lookup. * Returns 0 if no map exists. @@ -64,11 +101,18 @@ pmap_getport (address, program, version, protocol) int socket = -1; CLIENT *client; struct pmap parms; + bool closeit = false; address->sin_port = htons (PMAPPORT); if (protocol == IPPROTO_TCP) - client = INTUSE(clnttcp_create) (address, PMAPPROG, PMAPVERS, &socket, - RPCSMALLMSGSIZE, RPCSMALLMSGSIZE); + { + /* Don't need a reserved port to get ports from the portmapper. */ + socket = __get_socket(address); + if (socket != -1) + closeit = true; + client = INTUSE(clnttcp_create) (address, PMAPPROG, PMAPVERS, &socket, + RPCSMALLMSGSIZE, RPCSMALLMSGSIZE); + } else client = INTUSE(clntudp_bufcreate) (address, PMAPPROG, PMAPVERS, timeout, &socket, RPCSMALLMSGSIZE, @@ -93,7 +137,9 @@ pmap_getport (address, program, version, protocol) } CLNT_DESTROY (client); } - /* (void)close(socket); CLNT_DESTROY already closed it */ + /* We only need to close the socket here if we opened it. */ + if (closeit) + (void) __close (socket); address->sin_port = 0; return port; } diff --git a/sunrpc/pmap_rmt.c b/sunrpc/pmap_rmt.c index 644d503a1f..e068848919 100644 --- a/sunrpc/pmap_rmt.c +++ b/sunrpc/pmap_rmt.c @@ -125,8 +125,9 @@ xdr_rmtcall_args (XDR *xdrs, struct rmtcallargs *cap) INTUSE(xdr_u_long) (xdrs, &(cap->vers)) && INTUSE(xdr_u_long) (xdrs, &(cap->proc))) { + u_long dummy_arglen = 0; lenposition = XDR_GETPOS (xdrs); - if (!INTUSE(xdr_u_long) (xdrs, &(cap->arglen))) + if (!INTUSE(xdr_u_long) (xdrs, &dummy_arglen)) return FALSE; argposition = XDR_GETPOS (xdrs); if (!(*(cap->xdr_args)) (xdrs, cap->args_ptr)) diff --git a/sunrpc/rpc_clntout.c b/sunrpc/rpc_clntout.c index 4e2832ff56..08d9601212 100644 --- a/sunrpc/rpc_clntout.c +++ b/sunrpc/rpc_clntout.c @@ -31,10 +31,6 @@ /* * From: @(#)rpc_clntout.c 1.11 89/02/22 (C) 1987 SMI */ -#if defined(LIBC_SCCS) && !defined(lint) -static const char clntout_rcsid[] = - "$Id$"; -#endif /* * rpc_clntout.c, Client-stub outputter for the RPC protocol compiler diff --git a/sunrpc/rpc_cout.c b/sunrpc/rpc_cout.c index a803feb65a..21056e84a6 100644 --- a/sunrpc/rpc_cout.c +++ b/sunrpc/rpc_cout.c @@ -31,10 +31,6 @@ /* * From: @(#)rpc_cout.c 1.13 89/02/22 (C) 1987 SMI */ -#if defined(LIBC_SCCS) && !defined(lint) -static const char cout_rcsid[] = -"$Id$"; -#endif /* * rpc_cout.c, XDR routine outputter for the RPC protocol compiler @@ -555,6 +551,7 @@ inline_struct (definition *def, int flag) } size = 0; i = 0; + free (sizestr); sizestr = NULL; print_stat (indent + 1, &dl->decl); } diff --git a/sunrpc/rpc_hout.c b/sunrpc/rpc_hout.c index 38cb419527..270d149a6e 100644 --- a/sunrpc/rpc_hout.c +++ b/sunrpc/rpc_hout.c @@ -31,10 +31,6 @@ /* * From: @(#)rpc_hout.c 1.12 89/02/22 (C) 1987 SMI */ -#if defined(LIBC_SCCS) && !defined(lint) -static const char hout_rcsid[] = - "$Id$"; -#endif /* * rpc_hout.c, Header file outputter for the RPC protocol compiler diff --git a/sunrpc/rpc_main.c b/sunrpc/rpc_main.c index fee83514d1..954657a7e4 100644 --- a/sunrpc/rpc_main.c +++ b/sunrpc/rpc_main.c @@ -31,10 +31,6 @@ /* * From @(#)rpc_main.c 1.30 89/03/30 (C) 1987 SMI; */ -#if defined(LIBC_SCCS) && !defined(lint) -static const char main_rcsid[] = - "$Id$"; -#endif /* * rpc_main.c, Top level of the RPC protocol compiler. @@ -535,7 +531,7 @@ generate_guard (const char *pathname) filename = strrchr (pathname, '/'); /* find last component */ filename = ((filename == NULL) ? pathname : filename + 1); - guard = strdup (filename); + guard = extendfile (filename, "_H_RPCGEN"); /* convert to upper case */ tmp = guard; while (*tmp) @@ -545,7 +541,6 @@ generate_guard (const char *pathname) tmp++; } - guard = extendfile (guard, "_H_RPCGEN"); return guard; } @@ -665,6 +660,7 @@ h_output (const char *infile, const char *define, int extend, } fprintf (fout, "\n#endif /* !_%s */\n", guard); + free (guard); close_input (); close_output (outfilename); } @@ -695,11 +691,9 @@ s_output (int argc, const char *argv[], const char *infile, const char *define, fprintf (fout, "#include <stdio.h>\n"); fprintf (fout, "#include <stdlib.h>\n"); + fprintf (fout, "#include <rpc/pmap_clnt.h>\n"); if (Cflag) - { - fprintf (fout, "#include <rpc/pmap_clnt.h>\n"); - fprintf (fout, "#include <string.h>\n"); - } + fprintf (fout, "#include <string.h>\n"); if (strcmp (svcclosetime, "-1") == 0) indefinitewait = 1; else if (strcmp (svcclosetime, "0") == 0) @@ -952,6 +946,8 @@ clnt_output (const char *infile, const char *define, int extend, close_output (outfilename); } +static const char space[] = " "; + static char * file_name (const char *file, const char *ext) { @@ -960,16 +956,17 @@ file_name (const char *file, const char *ext) if (access (temp, F_OK) != -1) return (temp); - else - return ((char *) " "); + + free (temp); + return (char *) space; } static void mkfile_output (struct commandline *cmd) { char *mkfilename; - const char *clientname, *clntname, *xdrname, *hdrname; - const char *servername, *svcname, *servprogname, *clntprogname; + char *clientname, *clntname, *xdrname, *hdrname; + char *servername, *svcname, *servprogname, *clntprogname; svcname = file_name (cmd->infile, "_svc.c"); clntname = file_name (cmd->infile, "_clnt.c"); @@ -983,8 +980,8 @@ mkfile_output (struct commandline *cmd) } else { - servername = " "; - clientname = " "; + servername = (char *) space; + clientname = (char *) space; } servprogname = extendfile (cmd->infile, "_server"); clntprogname = extendfile (cmd->infile, "_client"); @@ -994,6 +991,8 @@ mkfile_output (struct commandline *cmd) char *cp, *temp; mkfilename = alloc (strlen ("Makefile.") + strlen (cmd->infile) + 1); + if (mkfilename == NULL) + abort (); temp = rindex (cmd->infile, '.'); cp = stpcpy (mkfilename, "Makefile."); strncpy (cp, cmd->infile, (temp - cmd->infile)); @@ -1052,6 +1051,23 @@ $(LDLIBS) \n\n"); f_print (fout, "clean:\n\t $(RM) core $(TARGETS) $(OBJECTS_CLNT) \ $(OBJECTS_SVC) $(CLIENT) $(SERVER)\n\n"); close_output (mkfilename); + + free (clntprogname); + free (servprogname); + if (servername != space) + free (servername); + if (clientname != space) + free (clientname); + if (mkfilename != (char *) cmd->outfile) + free (mkfilename); + if (svcname != space) + free (svcname); + if (clntname != space) + free (clntname); + if (xdrname != space) + free (xdrname); + if (hdrname != space) + free (hdrname); } /* diff --git a/sunrpc/rpc_parse.c b/sunrpc/rpc_parse.c index 7115cbdd08..f66538701f 100644 --- a/sunrpc/rpc_parse.c +++ b/sunrpc/rpc_parse.c @@ -31,10 +31,6 @@ /* * From: @(#)rpc_parse.c 1.8 89/02/22 (C) 1987 SMI */ -#if defined(LIBC_SCCS) && !defined(lint) -static const char parse_rcsid[] = - "$Id$"; -#endif /* * rpc_parse.c, Parser for the RPC protocol compiler @@ -95,6 +91,7 @@ get_definition (void) def_const (defp); break; case TOK_EOF: + free (defp); return (NULL); default: error ("definition keyword expected"); @@ -306,7 +303,9 @@ def_union (definition *defp) case_list *cases; /* case_list *tcase; */ case_list **tailp; +#if 0 int flag; +#endif defp->def_kind = DEF_UNION; scan (TOK_IDENT, &tok); @@ -326,7 +325,9 @@ def_union (definition *defp) cases->case_name = tok.str; scan (TOK_COLON, &tok); /* now peek at next token */ +#if 0 flag = 0; +#endif if (peekscan (TOK_CASE, &tok)) { @@ -343,6 +344,7 @@ def_union (definition *defp) } while (peekscan (TOK_CASE, &tok)); } +#if 0 else if (flag) { @@ -350,6 +352,7 @@ def_union (definition *defp) tailp = &cases->next; cases = ALLOC (case_list); }; +#endif get_declaration (&dec, DEF_UNION); cases->case_decl = dec; diff --git a/sunrpc/rpc_sample.c b/sunrpc/rpc_sample.c index 50c3d5554b..00b58d5bc2 100644 --- a/sunrpc/rpc_sample.c +++ b/sunrpc/rpc_sample.c @@ -31,10 +31,6 @@ /* * From: @(#)rpc_sample.c 1.1 90/08/30 (C) 1987 SMI */ -#if defined(LIBC_SCCS) && !defined(lint) -static const char sample_rcsid[] = - "$Id$"; -#endif /* * rpc_sample.c, Sample client-server code outputter for the RPC protocol compiler diff --git a/sunrpc/rpc_scan.c b/sunrpc/rpc_scan.c index d6211e9105..af90ef6973 100644 --- a/sunrpc/rpc_scan.c +++ b/sunrpc/rpc_scan.c @@ -31,10 +31,6 @@ /* * From: @(#)rpc_scan.c 1.11 89/02/22 (C) 1987 SMI */ -#if defined(LIBC_SCCS) && !defined(lint) -static const char scan_rcsid[] = - "$Id$"; -#endif /* * rpc_scan.c, Scanner for the RPC protocol compiler @@ -539,6 +535,7 @@ docppline (const char *line, int *lineno, const char **fname) *p = 0; if (*file == 0) { + free (file); *fname = NULL; } else diff --git a/sunrpc/rpc_svcout.c b/sunrpc/rpc_svcout.c index 9a807c4096..6774cc8c0f 100644 --- a/sunrpc/rpc_svcout.c +++ b/sunrpc/rpc_svcout.c @@ -31,10 +31,6 @@ /* * From: @(#)rpc_svcout.c 1.29 89/03/30 (C) 1987 SMI */ -#if defined(LIBC_SCCS) && !defined(lint) -static const char svcout_rcsid[] = - "$Id$"; -#endif /* * rpc_svcout.c, Server-skeleton outputter for the RPC protocol compiler diff --git a/sunrpc/rpc_tblout.c b/sunrpc/rpc_tblout.c index bf4037fc37..8fd2b1267d 100644 --- a/sunrpc/rpc_tblout.c +++ b/sunrpc/rpc_tblout.c @@ -31,10 +31,6 @@ /* * From: @(#)rpc_tblout.c 1.4 89/02/22 (C) 1988 SMI */ -#if defined(LIBC_SCCS) && !defined(lint) -static const char tblout_rcsid[] = - "$Id$"; -#endif /* * rpc_tblout.c, Dispatch table outputter for the RPC protocol compiler diff --git a/sunrpc/rpc_thread.c b/sunrpc/rpc_thread.c index fbc1cf72fe..91e94c2eab 100644 --- a/sunrpc/rpc_thread.c +++ b/sunrpc/rpc_thread.c @@ -20,7 +20,7 @@ __rpc_thread_destroy (void) { struct rpc_thread_variables *tvp = __libc_tsd_get (RPC_VARS); - if (tvp != NULL && tvp != &__libc_tsd_RPC_VARS_mem) { + if (tvp != NULL) { __rpc_thread_svc_cleanup (); __rpc_thread_clnt_cleanup (); __rpc_thread_key_cleanup (); @@ -29,7 +29,8 @@ __rpc_thread_destroy (void) free (tvp->svcraw_private_s); free (tvp->authdes_cache_s); free (tvp->authdes_lru_s); - free (tvp); + if (tvp != &__libc_tsd_RPC_VARS_mem) + free (tvp); __libc_tsd_set (RPC_VARS, NULL); } } diff --git a/sunrpc/rpc_util.c b/sunrpc/rpc_util.c index 31e1d3143c..b910401a31 100644 --- a/sunrpc/rpc_util.c +++ b/sunrpc/rpc_util.c @@ -31,10 +31,6 @@ /* * From: @(#)rpc_util.c 1.11 89/02/22 (C) 1987 SMI */ -#if defined(LIBC_SCCS) && !defined(lint) -static const char util_rcsid[] = - "$Id$"; -#endif /* * rpc_util.c, Utility routines for the RPC protocol compiler diff --git a/sunrpc/rtime.c b/sunrpc/rtime.c index 4996f01ba9..ff71a55aeb 100644 --- a/sunrpc/rtime.c +++ b/sunrpc/rtime.c @@ -80,7 +80,7 @@ rtime (struct sockaddr_in *addrp, struct rpc_timeval *timep, /* RFC 868 says the time is transmitted as a 32-bit value. */ uint32_t thetime; struct sockaddr_in from; - int fromlen; + socklen_t fromlen; int type; if (timeout == NULL) diff --git a/sunrpc/svc.c b/sunrpc/svc.c index 6caf8412d5..1e358e247c 100644 --- a/sunrpc/svc.c +++ b/sunrpc/svc.c @@ -372,7 +372,7 @@ svc_getreqset (fd_set *readfds) setsize = FD_SETSIZE; maskp = readfds->fds_bits; for (sock = 0; sock < setsize; sock += NFDBITS) - for (mask = *maskp++; (bit = ffs (mask)); mask ^= (1 << (bit - 1))) + for (mask = *maskp++; (bit = ffsl (mask)); mask ^= (1L << (bit - 1))) INTUSE(svc_getreq_common) (sock + bit - 1); } INTDEF (svc_getreqset) @@ -380,22 +380,24 @@ INTDEF (svc_getreqset) void svc_getreq_poll (struct pollfd *pfdp, int pollretval) { - register int i; - register int fds_found; + if (pollretval == 0) + return; - for (i = fds_found = 0; i < svc_max_pollfd && fds_found < pollretval; ++i) + register int fds_found; + for (int i = fds_found = 0; i < svc_max_pollfd; ++i) { register struct pollfd *p = &pfdp[i]; if (p->fd != -1 && p->revents) { /* fd has input waiting */ - ++fds_found; - if (p->revents & POLLNVAL) xprt_unregister (xports[p->fd]); else INTUSE(svc_getreq_common) (p->fd); + + if (++fds_found >= pollretval) + break; } } } diff --git a/sunrpc/svc_raw.c b/sunrpc/svc_raw.c index 37a027d412..ff8fa7ccd9 100644 --- a/sunrpc/svc_raw.c +++ b/sunrpc/svc_raw.c @@ -66,7 +66,7 @@ static bool_t svcraw_reply (SVCXPRT *, struct rpc_msg *); static bool_t svcraw_freeargs (SVCXPRT *, xdrproc_t, caddr_t); static void svcraw_destroy (SVCXPRT *); -static struct xp_ops server_ops = +static const struct xp_ops server_ops = { svcraw_recv, svcraw_stat, @@ -89,7 +89,7 @@ svcraw_create (void) } srp->server.xp_sock = 0; srp->server.xp_port = 0; - srp->server.xp_ops = &server_ops; + srp->server.xp_ops = (struct xp_ops *) &server_ops; srp->server.xp_verf.oa_base = srp->verf_body; INTUSE(xdrmem_create) (&srp->xdr_stream, srp->_raw_buf, UDPMSGSIZE, XDR_FREE); diff --git a/sunrpc/svc_run.c b/sunrpc/svc_run.c index 017910b453..d5e24dd0fc 100644 --- a/sunrpc/svc_run.c +++ b/sunrpc/svc_run.c @@ -60,6 +60,12 @@ svc_run (void) return; my_pollfd = malloc (sizeof (struct pollfd) * svc_max_pollfd); + if (my_pollfd == NULL) + { + perror (_("svc_run: - out of memory")); + return; + } + for (i = 0; i < svc_max_pollfd; ++i) { my_pollfd[i].fd = svc_pollfd[i].fd; diff --git a/sunrpc/svc_simple.c b/sunrpc/svc_simple.c index 5ac21ffdbd..6c1c9c914e 100644 --- a/sunrpc/svc_simple.c +++ b/sunrpc/svc_simple.c @@ -125,12 +125,7 @@ registerrpc (u_long prognum, u_long versnum, u_long procnum, err_out: if (buf == NULL) return -1; -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", buf); - else -#endif - (void) fputs (buf, stderr); + (void) __fxprintf (NULL, "%s", buf); free (buf); return -1; } @@ -189,12 +184,7 @@ universal (struct svc_req *rqstp, SVCXPRT *transp_l) err_out2: if (buf == NULL) exit (1); -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", buf); - else -#endif - fputs (buf, stderr); + __fxprintf (NULL, "%s", buf); free (buf); exit (1); } diff --git a/sunrpc/svc_tcp.c b/sunrpc/svc_tcp.c index 4decfa4fd0..539a2b8d98 100644 --- a/sunrpc/svc_tcp.c +++ b/sunrpc/svc_tcp.c @@ -165,7 +165,7 @@ svctcp_create (int sock, u_int sendsize, u_int recvsize) (void) __bind (sock, (struct sockaddr *) &addr, len); } if ((__getsockname (sock, (struct sockaddr *) &addr, &len) != 0) || - (__listen (sock, 2) != 0)) + (__listen (sock, SOMAXCONN) != 0)) { perror (_("svc_tcp.c - cannot getsockname or listen")); if (madesock) @@ -176,12 +176,7 @@ svctcp_create (int sock, u_int sendsize, u_int recvsize) xprt = (SVCXPRT *) mem_alloc (sizeof (SVCXPRT)); if (r == NULL || xprt == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", _("svctcp_create: out of memory\n")); - else -#endif - (void) fputs (_("svctcp_create: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("svctcp_create: out of memory\n")); mem_free (r, sizeof (*r)); mem_free (xprt, sizeof (SVCXPRT)); return NULL; @@ -219,13 +214,8 @@ makefd_xprt (int fd, u_int sendsize, u_int recvsize) cd = (struct tcp_conn *) mem_alloc (sizeof (struct tcp_conn)); if (xprt == (SVCXPRT *) NULL || cd == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("svc_tcp: makefd_xprt: out of memory\n")); - else -#endif - (void) fputs (_("svc_tcp: makefd_xprt: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", + _("svc_tcp: makefd_xprt: out of memory\n")); mem_free (xprt, sizeof (SVCXPRT)); mem_free (cd, sizeof (struct tcp_conn)); return NULL; diff --git a/sunrpc/svc_udp.c b/sunrpc/svc_udp.c index 45f99440b2..dfeb6de70f 100644 --- a/sunrpc/svc_udp.c +++ b/sunrpc/svc_udp.c @@ -149,12 +149,7 @@ svcudp_bufcreate (sock, sendsz, recvsz) buf = mem_alloc (((MAX (sendsz, recvsz) + 3) / 4) * 4); if (xprt == NULL || su == NULL || buf == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", _("svcudp_create: out of memory\n")); - else -#endif - (void) fputs (_("svcudp_create: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("svcudp_create: out of memory\n")); mem_free (xprt, sizeof (SVCXPRT)); mem_free (su, sizeof (*su)); mem_free (buf, ((MAX (sendsz, recvsz) + 3) / 4) * 4); @@ -176,14 +171,8 @@ svcudp_bufcreate (sock, sendsz, recvsz) + sizeof(struct cmsghdr) + sizeof (struct in_pktinfo)) > sizeof (xprt->xp_pad)) { -# ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("svcudp_create: xp_pad is too small for IP_PKTINFO\n")); - else -# endif - (void) fputs (_("svcudp_create: xp_pad is too small for IP_PKTINFO\n"), - stderr); + (void) __fxprintf (NULL,"%s", _("\ +svcudp_create: xp_pad is too small for IP_PKTINFO\n")); return NULL; } pad = 1; @@ -411,22 +400,14 @@ svcudp_destroy (xprt) #define SPARSENESS 4 /* 75% sparse */ -#ifdef USE_IN_LIBIO -# define CACHE_PERROR(msg) \ - if (_IO_fwide (stderr, 0) > 0) \ - (void) __fwprintf(stderr, L"%s\n", msg); \ - else \ - (void) fprintf(stderr, "%s\n", msg) -#else -# define CACHE_PERROR(msg) \ - (void) fprintf(stderr,"%s\n", msg) -#endif +#define CACHE_PERROR(msg) \ + (void) __fxprintf(NULL, "%s\n", msg) #define ALLOC(type, size) \ (type *) mem_alloc((unsigned) (sizeof(type) * (size))) -#define BZERO(addr, type, size) \ - __bzero((char *) addr, sizeof(type) * (int) (size)) +#define CALLOC(type, size) \ + (type *) calloc (sizeof (type), size) /* * An entry in the cache @@ -501,20 +482,21 @@ svcudp_enablecache (SVCXPRT *transp, u_long size) } uc->uc_size = size; uc->uc_nextvictim = 0; - uc->uc_entries = ALLOC (cache_ptr, size * SPARSENESS); + uc->uc_entries = CALLOC (cache_ptr, size * SPARSENESS); if (uc->uc_entries == NULL) { + mem_free (uc, sizeof (struct udp_cache)); CACHE_PERROR (_("enablecache: could not allocate cache data")); return 0; } - BZERO (uc->uc_entries, cache_ptr, size * SPARSENESS); - uc->uc_fifo = ALLOC (cache_ptr, size); + uc->uc_fifo = CALLOC (cache_ptr, size); if (uc->uc_fifo == NULL) { + mem_free (uc->uc_entries, size * SPARSENESS); + mem_free (uc, sizeof (struct udp_cache)); CACHE_PERROR (_("enablecache: could not allocate cache fifo")); return 0; } - BZERO (uc->uc_fifo, cache_ptr, size); su->su_cache = (char *) uc; return 1; } @@ -564,6 +546,7 @@ cache_set (SVCXPRT *xprt, u_long replylen) newbuf = mem_alloc (su->su_iosz); if (newbuf == NULL) { + mem_free (victim, sizeof (struct cache_node)); CACHE_PERROR (_("cache_set: could not allocate new rpc_buffer")); return; } diff --git a/sunrpc/svc_unix.c b/sunrpc/svc_unix.c index cfbc63866b..1b7b1fbd4f 100644 --- a/sunrpc/svc_unix.c +++ b/sunrpc/svc_unix.c @@ -161,7 +161,7 @@ svcunix_create (int sock, u_int sendsize, u_int recvsize, char *path) __bind (sock, (struct sockaddr *) &addr, len); if (__getsockname (sock, (struct sockaddr *) &addr, &len) != 0 - || __listen (sock, 2) != 0) + || __listen (sock, SOMAXCONN) != 0) { perror (_("svc_unix.c - cannot getsockname or listen")); if (madesock) @@ -173,12 +173,7 @@ svcunix_create (int sock, u_int sendsize, u_int recvsize, char *path) xprt = (SVCXPRT *) mem_alloc (sizeof (SVCXPRT)); if (r == NULL || xprt == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - __fwprintf (stderr, L"%s", _("svcunix_create: out of memory\n")); - else -#endif - fputs (_("svcunix_create: out of memory\n"), stderr); + __fxprintf (NULL, "%s", _("svcunix_create: out of memory\n")); mem_free (r, sizeof (*r)); mem_free (xprt, sizeof (SVCXPRT)); return NULL; @@ -216,13 +211,8 @@ makefd_xprt (int fd, u_int sendsize, u_int recvsize) cd = (struct unix_conn *) mem_alloc (sizeof (struct unix_conn)); if (xprt == (SVCXPRT *) NULL || cd == (struct unix_conn *) NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("svc_unix: makefd_xprt: out of memory\n")); - else -#endif - (void) fputs (_("svc_unix: makefd_xprt: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", + _("svc_unix: makefd_xprt: out of memory\n")); mem_free (xprt, sizeof (SVCXPRT)); mem_free (cd, sizeof (struct unix_conn)); return NULL; diff --git a/sunrpc/svcauth_des.c b/sunrpc/svcauth_des.c index 07d7bd0122..933d001341 100644 --- a/sunrpc/svcauth_des.c +++ b/sunrpc/svcauth_des.c @@ -315,7 +315,7 @@ _svcauth_des (register struct svc_req *rqst, register struct rpc_msg *msg) /* * xdr the timestamp before encrypting */ - ixdr = (int32_t *) cryptbuf; + ixdr = (uint32_t *) cryptbuf; IXDR_PUT_INT32 (ixdr, timestamp.tv_sec - 1); IXDR_PUT_INT32 (ixdr, timestamp.tv_usec); @@ -396,11 +396,9 @@ cache_init (void) register int i; authdes_cache = (struct cache_entry *) - mem_alloc (sizeof (struct cache_entry) * AUTHDES_CACHESZ); + calloc (sizeof (struct cache_entry) * AUTHDES_CACHESZ, 1); if (authdes_cache == NULL) return; - __bzero ((char *) authdes_cache, - sizeof (struct cache_entry) * AUTHDES_CACHESZ); authdes_lru = (int *) mem_alloc (sizeof (int) * AUTHDES_CACHESZ); /* diff --git a/sunrpc/tst-xdrmem.c b/sunrpc/tst-xdrmem.c new file mode 100644 index 0000000000..0c9929c6ed --- /dev/null +++ b/sunrpc/tst-xdrmem.c @@ -0,0 +1,205 @@ +/* Copyright (C) 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2005. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <limits.h> +#include <stdio.h> +#include <string.h> +#include <rpc/rpc.h> + +static int +do_test (void) +{ + XDR xdrs; + unsigned char buf[8192]; + int v_int; + u_int v_u_int; + long v_long; + u_long v_u_long; + quad_t v_hyper; + u_quad_t v_u_hyper; + quad_t v_longlong_t; + u_quad_t v_u_longlong_t; + short v_short; + u_short v_u_short; + char v_char; + u_char v_u_char; + bool_t v_bool; + enum_t v_enum; + char *v_wrapstring; + + xdrmem_create (&xdrs, (char *) buf, sizeof (buf), XDR_ENCODE); + +#define TESTS \ + T(int, 0) \ + T(int, CHAR_MAX) \ + T(int, CHAR_MIN) \ + T(int, SHRT_MAX) \ + T(int, SHRT_MIN) \ + T(int, INT_MAX) \ + T(int, INT_MIN) \ + T(int, 0x123) \ + T(u_int, 0) \ + T(u_int, UCHAR_MAX) \ + T(u_int, USHRT_MAX) \ + T(u_int, UINT_MAX) \ + T(u_int, 0xdeadbeef) \ + T(u_int, 0x12345678) \ + T(long, 0) \ + T(long, 2147483647L) \ + T(long, -2147483648L) \ + T(long, -305419896L) \ + T(long, -305419896L) \ + T(u_long, 0) \ + T(u_long, 0xffffffffUL) \ + T(u_long, 0xdeadbeefUL) \ + T(u_long, 0x12345678UL) \ + T(hyper, 0) \ + T(hyper, CHAR_MAX) \ + T(hyper, CHAR_MIN) \ + T(hyper, SHRT_MAX) \ + T(hyper, SHRT_MIN) \ + T(hyper, INT_MAX) \ + T(hyper, INT_MIN) \ + T(hyper, LONG_MAX) \ + T(hyper, LONG_MIN) \ + T(hyper, LONG_LONG_MAX) \ + T(hyper, LONG_LONG_MIN) \ + T(hyper, 0x12312345678LL) \ + T(hyper, 0x12387654321LL) \ + T(u_hyper, 0) \ + T(u_hyper, UCHAR_MAX) \ + T(u_hyper, USHRT_MAX) \ + T(u_hyper, UINT_MAX) \ + T(u_hyper, ULONG_MAX) \ + T(u_hyper, ULONG_LONG_MAX) \ + T(u_hyper, 0xdeadbeefdeadbeefULL) \ + T(u_hyper, 0x12312345678ULL) \ + T(u_hyper, 0x12387654321ULL) \ + T(longlong_t, 0) \ + T(longlong_t, CHAR_MAX) \ + T(longlong_t, CHAR_MIN) \ + T(longlong_t, SHRT_MAX) \ + T(longlong_t, SHRT_MIN) \ + T(longlong_t, INT_MAX) \ + T(longlong_t, INT_MIN) \ + T(longlong_t, LONG_MAX) \ + T(longlong_t, LONG_MIN) \ + T(longlong_t, LONG_LONG_MAX) \ + T(longlong_t, LONG_LONG_MIN) \ + T(longlong_t, 0x12312345678LL) \ + T(longlong_t, 0x12387654321LL) \ + T(u_longlong_t, 0) \ + T(u_longlong_t, UCHAR_MAX) \ + T(u_longlong_t, USHRT_MAX) \ + T(u_longlong_t, UINT_MAX) \ + T(u_longlong_t, ULONG_MAX) \ + T(u_longlong_t, ULONG_LONG_MAX) \ + T(u_longlong_t, 0xdeadbeefdeadbeefULL)\ + T(u_longlong_t, 0x12312345678ULL) \ + T(u_longlong_t, 0x12387654321ULL) \ + T(short, CHAR_MAX) \ + T(short, CHAR_MIN) \ + T(short, SHRT_MAX) \ + T(short, SHRT_MIN) \ + T(short, 0x123) \ + T(u_short, 0) \ + T(u_short, UCHAR_MAX) \ + T(u_short, USHRT_MAX) \ + T(u_short, 0xbeef) \ + T(u_short, 0x5678) \ + T(char, CHAR_MAX) \ + T(char, CHAR_MIN) \ + T(char, 0x23) \ + T(u_char, 0) \ + T(u_char, UCHAR_MAX) \ + T(u_char, 0xef) \ + T(u_char, 0x78) \ + T(bool, 0) \ + T(bool, 1) \ + T(enum, 0) \ + T(enum, CHAR_MAX) \ + T(enum, CHAR_MIN) \ + T(enum, SHRT_MAX) \ + T(enum, SHRT_MIN) \ + T(enum, INT_MAX) \ + T(enum, INT_MIN) \ + T(enum, 0x123) \ + S(wrapstring, (char *) "") \ + S(wrapstring, (char *) "hello, world") + +#define T(type, val) \ + v_##type = val; \ + if (! xdr_##type (&xdrs, &v_##type)) \ + { \ + puts ("encoding of " #type \ + " " #val " failed"); \ + return 1; \ + } +#define S(type, val) T(type, val) + + TESTS +#undef T +#undef S + + xdr_destroy (&xdrs); + + xdrmem_create (&xdrs, (char *) buf, sizeof (buf), XDR_DECODE); + +#define T(type, val) \ + v_##type = 0x15; \ + if (! xdr_##type (&xdrs, &v_##type)) \ + { \ + puts ("decoding of " #type \ + " " #val " failed"); \ + return 1; \ + } \ + if (v_##type != val) \ + { \ + puts ("decoded value differs, " \ + "type " #type " " #val); \ + return 1; \ + } +#define S(type, val) \ + v_##type = NULL; \ + if (! xdr_##type (&xdrs, &v_##type)) \ + { \ + puts ("decoding of " #type \ + " " #val " failed"); \ + return 1; \ + } \ + if (strcmp (v_##type, val)) \ + { \ + puts ("decoded value differs, " \ + "type " #type " " #val); \ + return 1; \ + } \ + free (v_##type); \ + v_##type = NULL; + + TESTS +#undef T +#undef S + + xdr_destroy (&xdrs); + + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/sunrpc/tst-xdrmem2.c b/sunrpc/tst-xdrmem2.c new file mode 100644 index 0000000000..eed8ccc072 --- /dev/null +++ b/sunrpc/tst-xdrmem2.c @@ -0,0 +1,114 @@ +/* Copyright (C) 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2006. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <limits.h> +#include <stdio.h> +#include <string.h> +#include <rpc/rpc.h> +#include <sys/mman.h> +#include <unistd.h> + +static int +do_test (void) +{ + XDR xdrs; + void *buf; + size_t ps = sysconf (_SC_PAGESIZE); + uintptr_t half = -1; + int v_int; + u_short v_u_short; + + half = (half >> 1) & ~(uintptr_t) (ps - 1); + buf = mmap ((void *) half, 2 * ps, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, -1, 0); + if (buf == MAP_FAILED || buf != (void *) half) + { + puts ("Couldn't mmap 2 pages in the middle of address space"); + return 0; + } + + xdrmem_create (&xdrs, (char *) buf, 2 * ps, XDR_ENCODE); + +#define T(type, val) \ + v_##type = val; \ + if (! xdr_##type (&xdrs, &v_##type)) \ + { \ + puts ("encoding of " #type \ + " " #val " failed"); \ + return 1; \ + } + + T(int, 127) + + u_int pos = xdr_getpos (&xdrs); + + T(u_short, 31) + + if (! xdr_setpos (&xdrs, pos)) + { + puts ("xdr_setpos during encoding failed"); + return 1; + } + + T(u_short, 36) + +#undef T + + xdr_destroy (&xdrs); + + xdrmem_create (&xdrs, (char *) buf, 2 * ps, XDR_DECODE); + +#define T(type, val) \ + v_##type = 0x15; \ + if (! xdr_##type (&xdrs, &v_##type)) \ + { \ + puts ("decoding of " #type \ + " " #val " failed"); \ + return 1; \ + } \ + if (v_##type != val) \ + { \ + puts ("decoded value differs, " \ + "type " #type " " #val); \ + return 1; \ + } + + T(int, 127) + + pos = xdr_getpos (&xdrs); + + T(u_short, 36) + + if (! xdr_setpos (&xdrs, pos)) + { + puts ("xdr_setpos during encoding failed"); + return 1; + } + + T(u_short, 36) + +#undef T + + xdr_destroy (&xdrs); + + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/sunrpc/xdr.c b/sunrpc/xdr.c index d99a9985c4..21e339b4ee 100644 --- a/sunrpc/xdr.c +++ b/sunrpc/xdr.c @@ -131,7 +131,7 @@ bool_t xdr_u_int (XDR *xdrs, u_int *up) { #if UINT_MAX < ULONG_MAX - u_long l; + long l; switch (xdrs->x_op) { @@ -144,7 +144,7 @@ xdr_u_int (XDR *xdrs, u_int *up) { return FALSE; } - *up = (u_int) l; + *up = (u_int) (u_long) l; case XDR_FREE: return TRUE; } @@ -225,8 +225,7 @@ INTDEF(xdr_u_long) bool_t xdr_hyper (XDR *xdrs, quad_t *llp) { - long t1; - unsigned long int t2; + long int t1, t2; if (xdrs->x_op == XDR_ENCODE) { @@ -240,7 +239,7 @@ xdr_hyper (XDR *xdrs, quad_t *llp) if (!XDR_GETLONG(xdrs, &t1) || !XDR_GETLONG(xdrs, &t2)) return FALSE; *llp = ((quad_t) t1) << 32; - *llp |= t2; + *llp |= (uint32_t) t2; return TRUE; } @@ -259,8 +258,7 @@ INTDEF(xdr_hyper) bool_t xdr_u_hyper (XDR *xdrs, u_quad_t *ullp) { - unsigned long t1; - unsigned long t2; + long int t1, t2; if (xdrs->x_op == XDR_ENCODE) { @@ -274,7 +272,7 @@ xdr_u_hyper (XDR *xdrs, u_quad_t *ullp) if (!XDR_GETLONG(xdrs, &t1) || !XDR_GETLONG(xdrs, &t2)) return FALSE; *ullp = ((u_quad_t) t1) << 32; - *ullp |= t2; + *ullp |= (uint32_t) t2; return TRUE; } @@ -332,7 +330,7 @@ INTDEF(xdr_short) bool_t xdr_u_short (XDR *xdrs, u_short *usp) { - u_long l; + long l; switch (xdrs->x_op) { @@ -345,7 +343,7 @@ xdr_u_short (XDR *xdrs, u_short *usp) { return FALSE; } - *usp = (u_short) l; + *usp = (u_short) (u_long) l; return TRUE; case XDR_FREE: @@ -565,12 +563,7 @@ xdr_bytes (xdrs, cpp, sizep, maxsize) } if (sp == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", _("xdr_bytes: out of memory\n")); - else -#endif - (void) fputs (_("xdr_bytes: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("xdr_bytes: out of memory\n")); return FALSE; } /* fall into ... */ @@ -722,13 +715,7 @@ xdr_string (xdrs, cpp, maxsize) *cpp = sp = (char *) mem_alloc (nodesize); if (sp == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("xdr_string: out of memory\n")); - else -#endif - (void) fputs (_("xdr_string: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("xdr_string: out of memory\n")); return FALSE; } sp[size] = 0; diff --git a/sunrpc/xdr_array.c b/sunrpc/xdr_array.c index 9f67e7fe62..44abdbcfda 100644 --- a/sunrpc/xdr_array.c +++ b/sunrpc/xdr_array.c @@ -74,7 +74,6 @@ xdr_array (xdrs, addrp, sizep, maxsize, elsize, elproc) caddr_t target = *addrp; u_int c; /* the actual element count */ bool_t stat = TRUE; - u_int nodesize; /* like strings, arrays are really counted arrays */ if (!INTUSE(xdr_u_int) (xdrs, sizep)) @@ -90,7 +89,6 @@ xdr_array (xdrs, addrp, sizep, maxsize, elsize, elproc) { return FALSE; } - nodesize = c * elsize; /* * if we are deserializing, we may need to allocate an array. @@ -102,19 +100,12 @@ xdr_array (xdrs, addrp, sizep, maxsize, elsize, elproc) case XDR_DECODE: if (c == 0) return TRUE; - *addrp = target = mem_alloc (nodesize); + *addrp = target = calloc (c, elsize); if (target == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("xdr_array: out of memory\n")); - else -#endif - (void) fputs (_("xdr_array: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("xdr_array: out of memory\n")); return FALSE; } - __bzero (target, nodesize); break; case XDR_FREE: @@ -137,7 +128,7 @@ xdr_array (xdrs, addrp, sizep, maxsize, elsize, elproc) */ if (xdrs->x_op == XDR_FREE) { - mem_free (*addrp, nodesize); + mem_free (*addrp, c * elsize); *addrp = NULL; } return stat; diff --git a/sunrpc/xdr_intXX_t.c b/sunrpc/xdr_intXX_t.c index 9d2f92e10d..6c1fca2b23 100644 --- a/sunrpc/xdr_intXX_t.c +++ b/sunrpc/xdr_intXX_t.c @@ -1,4 +1,4 @@ -/* Copyright (c) 1998, 1999, 2000, 2004 Free Software Foundation, Inc. +/* Copyright (c) 1998, 1999, 2000, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1998. @@ -31,10 +31,7 @@ bool_t xdr_int64_t (XDR *xdrs, int64_t *ip) { - int32_t t1; - /* This must be unsigned, otherwise we get problems with sign - extension in the DECODE case. */ - uint32_t t2; + int32_t t1, t2; switch (xdrs->x_op) { @@ -46,7 +43,7 @@ xdr_int64_t (XDR *xdrs, int64_t *ip) if (!XDR_GETINT32(xdrs, &t1) || !XDR_GETINT32(xdrs, &t2)) return FALSE; *ip = ((int64_t) t1) << 32; - *ip |= t2; + *ip |= (uint32_t) t2; /* Avoid sign extension. */ return TRUE; case XDR_FREE: return TRUE; diff --git a/sunrpc/xdr_mem.c b/sunrpc/xdr_mem.c index e3167de040..7b1261bbae 100644 --- a/sunrpc/xdr_mem.c +++ b/sunrpc/xdr_mem.c @@ -177,13 +177,15 @@ xdrmem_setpos (xdrs, pos) { caddr_t newaddr = xdrs->x_base + pos; caddr_t lastaddr = xdrs->x_private + xdrs->x_handy; + size_t handy = lastaddr - newaddr; - if ((long) newaddr > (long) lastaddr - || (UINT_MAX < LONG_MAX - && (long) UINT_MAX < (long) lastaddr - (long) newaddr)) + if (newaddr > lastaddr + || newaddr < xdrs->x_base + || handy != (u_int) handy) return FALSE; + xdrs->x_private = newaddr; - xdrs->x_handy = (long) lastaddr - (long) newaddr; + xdrs->x_handy = (u_int) handy; return TRUE; } diff --git a/sunrpc/xdr_rec.c b/sunrpc/xdr_rec.c index 5e59c88523..e847e9b47c 100644 --- a/sunrpc/xdr_rec.c +++ b/sunrpc/xdr_rec.c @@ -153,12 +153,7 @@ xdrrec_create (XDR *xdrs, u_int sendsize, if (rstrm == NULL || buf == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", _("xdrrec_create: out of memory\n")); - else -#endif - (void) fputs (_("xdrrec_create: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", _("xdrrec_create: out of memory\n")); mem_free (rstrm, sizeof (RECSTREAM)); mem_free (buf, sendsize + recvsize + BYTES_PER_XDR_UNIT); /* @@ -181,7 +176,7 @@ xdrrec_create (XDR *xdrs, u_int sendsize, /* * now the rest ... */ - /* We have to add the const since the `struct xdr_ops' in `struct XDR' + /* We have to add the cast since the `struct xdr_ops' in `struct XDR' is not `const'. */ xdrs->x_ops = (struct xdr_ops *) &xdrrec_ops; xdrs->x_private = (caddr_t) rstrm; diff --git a/sunrpc/xdr_ref.c b/sunrpc/xdr_ref.c index ab706d7f84..bc5f72d6a6 100644 --- a/sunrpc/xdr_ref.c +++ b/sunrpc/xdr_ref.c @@ -79,19 +79,13 @@ xdr_reference (xdrs, pp, size, proc) return TRUE; case XDR_DECODE: - *pp = loc = (caddr_t) mem_alloc (size); + *pp = loc = (caddr_t) calloc (1, size); if (loc == NULL) { -#ifdef USE_IN_LIBIO - if (_IO_fwide (stderr, 0) > 0) - (void) __fwprintf (stderr, L"%s", - _("xdr_reference: out of memory\n")); - else -#endif - (void) fputs (_("xdr_reference: out of memory\n"), stderr); + (void) __fxprintf (NULL, "%s", + _("xdr_reference: out of memory\n")); return FALSE; } - __bzero (loc, (int) size); break; default: break; diff --git a/sunrpc/xdr_stdio.c b/sunrpc/xdr_stdio.c index 4daa062c82..e73c5a5202 100644 --- a/sunrpc/xdr_stdio.c +++ b/sunrpc/xdr_stdio.c @@ -108,20 +108,20 @@ xdrstdio_destroy (XDR *xdrs) static bool_t xdrstdio_getlong (XDR *xdrs, long *lp) { - int32_t mycopy; + u_int32_t mycopy; - if (fread ((caddr_t) & mycopy, 4, 1, (FILE *) xdrs->x_private) != 1) + if (fread ((caddr_t) &mycopy, 4, 1, (FILE *) xdrs->x_private) != 1) return FALSE; - *lp = (int32_t) ntohl (mycopy); + *lp = (long) ntohl (mycopy); return TRUE; } static bool_t xdrstdio_putlong (XDR *xdrs, const long *lp) { - long mycopy = htonl (*lp); - lp = &mycopy; - if (fwrite ((caddr_t) lp, 4, 1, (FILE *) xdrs->x_private) != 1) + int32_t mycopy = htonl ((u_int32_t) *lp); + + if (fwrite ((caddr_t) &mycopy, 4, 1, (FILE *) xdrs->x_private) != 1) return FALSE; return TRUE; } |