about summary refs log tree commit diff
path: root/sunrpc
diff options
context:
space:
mode:
Diffstat (limited to 'sunrpc')
-rw-r--r--sunrpc/Makefile32
-rw-r--r--sunrpc/auth_des.c14
-rw-r--r--sunrpc/auth_none.c6
-rw-r--r--sunrpc/auth_unix.c12
-rw-r--r--sunrpc/bindrsvprt.c30
-rw-r--r--sunrpc/clnt_perr.c21
-rw-r--r--sunrpc/clnt_raw.c4
-rw-r--r--sunrpc/clnt_tcp.c12
-rw-r--r--sunrpc/clnt_udp.c12
-rw-r--r--sunrpc/clnt_unix.c12
-rw-r--r--sunrpc/create_xid.c2
-rw-r--r--sunrpc/des_impl.c35
-rw-r--r--sunrpc/key_call.c91
-rw-r--r--sunrpc/openchild.c2
-rw-r--r--sunrpc/pm_getmaps.c15
-rw-r--r--sunrpc/pm_getport.c52
-rw-r--r--sunrpc/pmap_rmt.c3
-rw-r--r--sunrpc/rpc_clntout.c4
-rw-r--r--sunrpc/rpc_cout.c5
-rw-r--r--sunrpc/rpc_hout.c4
-rw-r--r--sunrpc/rpc_main.c48
-rw-r--r--sunrpc/rpc_parse.c11
-rw-r--r--sunrpc/rpc_sample.c4
-rw-r--r--sunrpc/rpc_scan.c5
-rw-r--r--sunrpc/rpc_svcout.c4
-rw-r--r--sunrpc/rpc_tblout.c4
-rw-r--r--sunrpc/rpc_thread.c5
-rw-r--r--sunrpc/rpc_util.c4
-rw-r--r--sunrpc/rtime.c2
-rw-r--r--sunrpc/svc.c14
-rw-r--r--sunrpc/svc_raw.c4
-rw-r--r--sunrpc/svc_run.c6
-rw-r--r--sunrpc/svc_simple.c14
-rw-r--r--sunrpc/svc_tcp.c18
-rw-r--r--sunrpc/svc_udp.c43
-rw-r--r--sunrpc/svc_unix.c18
-rw-r--r--sunrpc/svcauth_des.c6
-rw-r--r--sunrpc/tst-xdrmem.c205
-rw-r--r--sunrpc/tst-xdrmem2.c114
-rw-r--r--sunrpc/xdr.c33
-rw-r--r--sunrpc/xdr_array.c15
-rw-r--r--sunrpc/xdr_intXX_t.c9
-rw-r--r--sunrpc/xdr_mem.c10
-rw-r--r--sunrpc/xdr_rec.c9
-rw-r--r--sunrpc/xdr_ref.c12
-rw-r--r--sunrpc/xdr_stdio.c12
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;
 }