2002-12-16 Roland McGrath * sunrpc/xdr_mem.c (xdrmem_inline): Fix argument type. * sunrpc/xdr_rec.c (xdrrec_inline): Likewise. * sunrpc/xdr_stdio.c (xdrstdio_inline): Likewise. 2002-12-13 Paul Eggert * sunrpc/rpc/xdr.h (struct XDR.xdr_ops.x_inline): 2nd arg is now u_int, not int. (struct XDR.x_handy): Now u_int, not int. * sunrpc/xdr_mem.c: Include . (xdrmem_getlong, xdrmem_putlong, xdrmem_getbytes, xdrmem_putbytes, xdrmem_inline, xdrmem_getint32, xdrmem_putint32): x_handy is now unsigned, not signed. Do not decrement x_handy if no change is made. (xdrmem_setpos): Check for int overflow. * sunrpc/xdr_sizeof.c (x_inline): 2nd arg is now unsigned. (xdr_sizeof): Remove cast that is now unnecessary, now that x_handy is unsigned. --- libc/sunrpc/xdr_mem.c 26 Feb 2002 01:43:56 -0000 1.13 +++ libc/sunrpc/xdr_mem.c 16 Dec 2002 10:25:27 -0000 1.15 @@ -39,6 +39,7 @@ */ #include +#include #include static bool_t xdrmem_getlong (XDR *, long *); @@ -47,7 +48,7 @@ static bool_t xdrmem_getbytes (XDR *, ca static bool_t xdrmem_putbytes (XDR *, const char *, u_int); static u_int xdrmem_getpos (const XDR *); static bool_t xdrmem_setpos (XDR *, u_int); -static int32_t *xdrmem_inline (XDR *, int); +static int32_t *xdrmem_inline (XDR *, u_int); static void xdrmem_destroy (XDR *); static bool_t xdrmem_getint32 (XDR *, int32_t *); static bool_t xdrmem_putint32 (XDR *, const int32_t *); @@ -100,8 +101,9 @@ xdrmem_destroy (XDR *xdrs) static bool_t xdrmem_getlong (XDR *xdrs, long *lp) { - if ((xdrs->x_handy -= 4) < 0) + if (xdrs->x_handy < 4) return FALSE; + xdrs->x_handy -= 4; *lp = (int32_t) ntohl ((*((int32_t *) (xdrs->x_private)))); xdrs->x_private += 4; return TRUE; @@ -115,8 +117,9 @@ xdrmem_getlong (XDR *xdrs, long *lp) static bool_t xdrmem_putlong (XDR *xdrs, const long *lp) { - if ((xdrs->x_handy -= 4) < 0) + if (xdrs->x_handy < 4) return FALSE; + xdrs->x_handy -= 4; *(int32_t *) xdrs->x_private = htonl (*lp); xdrs->x_private += 4; return TRUE; @@ -131,8 +134,9 @@ xdrmem_putlong (XDR *xdrs, const long *l static bool_t xdrmem_getbytes (XDR *xdrs, caddr_t addr, u_int len) { - if ((xdrs->x_handy -= len) < 0) + if (xdrs->x_handy < len) return FALSE; + xdrs->x_handy -= len; memcpy (addr, xdrs->x_private, len); xdrs->x_private += len; return TRUE; @@ -145,8 +149,9 @@ xdrmem_getbytes (XDR *xdrs, caddr_t addr static bool_t xdrmem_putbytes (XDR *xdrs, const char *addr, u_int len) { - if ((xdrs->x_handy -= len) < 0) + if (xdrs->x_handy < len) return FALSE; + xdrs->x_handy -= len; memcpy (xdrs->x_private, addr, len); xdrs->x_private += len; return TRUE; @@ -173,7 +178,9 @@ xdrmem_setpos (xdrs, pos) caddr_t newaddr = xdrs->x_base + pos; caddr_t lastaddr = xdrs->x_private + xdrs->x_handy; - if ((long) newaddr > (long) lastaddr) + if ((long) newaddr > (long) lastaddr + || (UINT_MAX < LONG_MAX + && (long) UINT_MAX < (long) lastaddr - (long) newaddr)) return FALSE; xdrs->x_private = newaddr; xdrs->x_handy = (long) lastaddr - (long) newaddr; @@ -184,7 +191,7 @@ xdrmem_setpos (xdrs, pos) * xdrs modified */ static int32_t * -xdrmem_inline (XDR *xdrs, int len) +xdrmem_inline (XDR *xdrs, u_int len) { int32_t *buf = 0; @@ -205,8 +212,9 @@ xdrmem_inline (XDR *xdrs, int len) static bool_t xdrmem_getint32 (XDR *xdrs, int32_t *ip) { - if ((xdrs->x_handy -= 4) < 0) + if (xdrs->x_handy < 4) return FALSE; + xdrs->x_handy -= 4; *ip = ntohl ((*((int32_t *) (xdrs->x_private)))); xdrs->x_private += 4; return TRUE; @@ -220,8 +228,9 @@ xdrmem_getint32 (XDR *xdrs, int32_t *ip) static bool_t xdrmem_putint32 (XDR *xdrs, const int32_t *ip) { - if ((xdrs->x_handy -= 4) < 0) + if (xdrs->x_handy < 4) return FALSE; + xdrs->x_handy -= 4; *(int32_t *) xdrs->x_private = htonl (*ip); xdrs->x_private += 4; return TRUE; --- libc/sunrpc/xdr_rec.c 4 Aug 2002 20:49:36 -0000 1.26 +++ libc/sunrpc/xdr_rec.c 16 Dec 2002 10:25:28 -0000 1.27 @@ -61,7 +61,7 @@ static bool_t xdrrec_getbytes (XDR *, ca static bool_t xdrrec_putbytes (XDR *, const char *, u_int); static u_int xdrrec_getpos (const XDR *); static bool_t xdrrec_setpos (XDR *, u_int); -static int32_t *xdrrec_inline (XDR *, int); +static int32_t *xdrrec_inline (XDR *, u_int); static void xdrrec_destroy (XDR *); static bool_t xdrrec_getint32 (XDR *, int32_t *); static bool_t xdrrec_putint32 (XDR *, const int32_t *); @@ -373,7 +373,7 @@ xdrrec_setpos (XDR *xdrs, u_int pos) } static int32_t * -xdrrec_inline (XDR *xdrs, int len) +xdrrec_inline (XDR *xdrs, u_int len) { RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private; int32_t *buf = NULL; --- libc/sunrpc/xdr_sizeof.c 28 Jan 2001 17:52:48 -0000 1.5 +++ libc/sunrpc/xdr_sizeof.c 16 Dec 2002 02:05:48 -0000 1.6 @@ -71,13 +71,13 @@ x_setpostn (XDR *xdrs, u_int len) } static int32_t * -x_inline (XDR *xdrs, int len) +x_inline (XDR *xdrs, u_int len) { if (len == 0) return NULL; if (xdrs->x_op != XDR_ENCODE) return NULL; - if (len < (int) (long int) xdrs->x_base) + if (len < (u_int) (long int) xdrs->x_base) { /* x_private was already allocated */ xdrs->x_handy += len; @@ -159,5 +159,5 @@ xdr_sizeof (xdrproc_t func, void *data) stat = func (&x, data); if (x.x_private) free (x.x_private); - return stat == TRUE ? (unsigned) x.x_handy : 0; + return stat == TRUE ? x.x_handy : 0; } --- libc/sunrpc/xdr_stdio.c 17 Sep 2002 10:58:04 -0000 1.15 +++ libc/sunrpc/xdr_stdio.c 16 Dec 2002 10:25:28 -0000 1.16 @@ -55,7 +55,7 @@ static bool_t xdrstdio_getbytes (XDR *, static bool_t xdrstdio_putbytes (XDR *, const char *, u_int); static u_int xdrstdio_getpos (const XDR *); static bool_t xdrstdio_setpos (XDR *, u_int); -static int32_t *xdrstdio_inline (XDR *, int); +static int32_t *xdrstdio_inline (XDR *, u_int); static void xdrstdio_destroy (XDR *); static bool_t xdrstdio_getint32 (XDR *, int32_t *); static bool_t xdrstdio_putint32 (XDR *, const int32_t *); @@ -157,7 +157,7 @@ xdrstdio_setpos (XDR *xdrs, u_int pos) } static int32_t * -xdrstdio_inline (XDR *xdrs, int len) +xdrstdio_inline (XDR *xdrs, u_int len) { /* * Must do some work to implement this: must insure --- libc/sunrpc/rpc/xdr.h 9 Oct 1999 21:26:03 -0000 1.26 +++ libc/sunrpc/rpc/xdr.h 16 Dec 2002 02:05:49 -0000 1.27 @@ -126,7 +126,7 @@ struct XDR /* returns bytes off from beginning */ bool_t (*x_setpostn) (XDR *__xdrs, u_int __pos); /* lets you reposition the stream */ - int32_t *(*x_inline) (XDR *__xdrs, int __len); + int32_t *(*x_inline) (XDR *__xdrs, u_int __len); /* buf quick ptr to buffered data */ void (*x_destroy) (XDR *__xdrs); /* free privates of this xdr_stream */ @@ -139,7 +139,7 @@ struct XDR caddr_t x_public; /* users' data */ caddr_t x_private; /* pointer to private data */ caddr_t x_base; /* private used for position info */ - int x_handy; /* extra private word */ + u_int x_handy; /* extra private word */ }; /*