(xdr_unixcred): Work around gcc alias warning.
[kopensolaris-gnu/glibc.git] / sunrpc / xdr_array.c
index a58fade..44abdbc 100644 (file)
@@ -44,6 +44,12 @@ static char sccsid[] = "@(#)xdr_array.c 1.10 87/08/11 Copyr 1984 Sun Micro";
 #include <string.h>
 #include <rpc/types.h>
 #include <rpc/xdr.h>
+#include <libintl.h>
+#include <limits.h>
+
+#ifdef USE_IN_LIBIO
+# include <wchar.h>
+#endif
 
 #define LASTUNSIGNED   ((u_int)0-1)
 
@@ -68,19 +74,21 @@ 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 (!xdr_u_int (xdrs, sizep))
+  if (!INTUSE(xdr_u_int) (xdrs, sizep))
     {
       return FALSE;
     }
   c = *sizep;
-  if ((c > maxsize) && (xdrs->x_op != XDR_FREE))
+  /*
+   * XXX: Let the overflow possibly happen with XDR_FREE because mem_free()
+   * doesn't actually use its second argument anyway.
+   */
+  if ((c > maxsize || c > UINT_MAX / elsize) && (xdrs->x_op != XDR_FREE))
     {
       return FALSE;
     }
-  nodesize = c * elsize;
 
   /*
    * if we are deserializing, we may need to allocate an array.
@@ -92,14 +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)
          {
-           (void) fprintf (stderr,
-                           "xdr_array: out of memory\n");
+           (void) __fxprintf (NULL, "%s", _("xdr_array: out of memory\n"));
            return FALSE;
          }
-       bzero (target, nodesize);
        break;
 
       case XDR_FREE:
@@ -122,11 +128,12 @@ 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;
 }
+INTDEF(xdr_array)
 
 /*
  * xdr_vector():