xdr: Len can never be negative
[openafs.git] / src / rx / xdr_mem.c
index 0430f1d..ae849f5 100644 (file)
@@ -5,23 +5,23 @@
  * may copy or modify Sun RPC without charge, but are not authorized
  * to license or distribute it to anyone else except as part of a product or
  * program developed by the user.
- * 
+ *
  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- * 
+ *
  * Sun RPC is provided with no support and without any obligation on the
  * part of Sun Microsystems, Inc. to assist in its use, correction,
  * modification or enhancement.
- * 
+ *
  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  * OR ANY PART THEREOF.
- * 
+ *
  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  * or profits or other special, indirect and consequential damages, even if
  * Sun has been advised of the possibility of such damages.
- * 
+ *
  * Sun Microsystems, Inc.
  * 2550 Garcia Avenue
  * Mountain View, California  94043
 #include <afsconfig.h>
 #include <afs/param.h>
 
-RCSID
-    ("$Header$");
-
-#ifndef        NeXT
-
 /*
  * xdr_mem.h, XDR implementation using memory buffers.
  *
@@ -45,39 +40,53 @@ RCSID
  *
  */
 
-#include "xdr.h"
-#ifndef AFS_NT40_ENV
-#include <netinet/in.h>
+#ifdef KERNEL
+# include "afs/sysincludes.h"
 #else
-#include <limits.h>
+# include <roken.h>
+# include <limits.h>
 #endif
 
-static bool_t xdrmem_getint32();
-static bool_t xdrmem_putint32();
-static bool_t xdrmem_getbytes();
-static bool_t xdrmem_putbytes();
-static u_int xdrmem_getpos();
-static bool_t xdrmem_setpos();
-static afs_int32 *xdrmem_inline();
-static void xdrmem_destroy();
+#include "xdr.h"
+
+static bool_t xdrmem_getint32(XDR *, afs_int32 *);
+static bool_t xdrmem_putint32(XDR *, afs_int32 *);
+static bool_t xdrmem_getbytes(XDR *, caddr_t, u_int);
+static bool_t xdrmem_putbytes(XDR *, caddr_t, u_int);
+static u_int xdrmem_getpos(XDR *);
+static bool_t xdrmem_setpos(XDR *, u_int);
+static afs_int32 *xdrmem_inline(XDR *, u_int);
+static void xdrmem_destroy(XDR *);
 
 static struct xdr_ops xdrmem_ops = {
-    xdrmem_getint32,
-    xdrmem_putint32,
-    xdrmem_getbytes,
-    xdrmem_putbytes,
-    xdrmem_getpos,
-    xdrmem_setpos,
-    xdrmem_inline,
-    xdrmem_destroy
+#ifndef HAVE_STRUCT_LABEL_SUPPORT
+    /* Windows does not support labeled assigments */
+    xdrmem_getint32,    /* deserialize an afs_int32 */
+    xdrmem_putint32,    /* serialize an afs_int32 */
+    xdrmem_getbytes,    /* deserialize counted bytes */
+    xdrmem_putbytes,    /* serialize counted bytes */
+    xdrmem_getpos,      /* get offset in the stream: not supported. */
+    xdrmem_setpos,      /* set offset in the stream: not supported. */
+    xdrmem_inline,      /* prime stream for inline macros */
+    xdrmem_destroy,     /* destroy stream */
+#else
+    .x_getint32 = xdrmem_getint32,
+    .x_putint32 = xdrmem_putint32,
+    .x_getbytes = xdrmem_getbytes,
+    .x_putbytes = xdrmem_putbytes,
+    .x_getpostn = xdrmem_getpos,
+    .x_setpostn = xdrmem_setpos,
+    .x_inline = xdrmem_inline,
+    .x_destroy = xdrmem_destroy
+#endif
 };
 
 /*
  * The procedure xdrmem_create initializes a stream descriptor for a
- * memory buffer.  
+ * memory buffer.
  */
 void
-xdrmem_create(register XDR * xdrs, caddr_t addr, u_int size, enum xdr_op op)
+xdrmem_create(XDR * xdrs, caddr_t addr, u_int size, enum xdr_op op)
 {
     xdrs->x_op = op;
     xdrs->x_ops = &xdrmem_ops;
@@ -86,12 +95,12 @@ xdrmem_create(register XDR * xdrs, caddr_t addr, u_int size, enum xdr_op op)
 }
 
 static void
-xdrmem_destroy(void)
+xdrmem_destroy(XDR *xdrs)
 {
 }
 
 static bool_t
-xdrmem_getint32(register XDR * xdrs, afs_int32 * lp)
+xdrmem_getint32(XDR *xdrs, afs_int32 * lp)
 {
     if (xdrs->x_handy < sizeof(afs_int32))
        return (FALSE);
@@ -103,7 +112,7 @@ xdrmem_getint32(register XDR * xdrs, afs_int32 * lp)
 }
 
 static bool_t
-xdrmem_putint32(register XDR * xdrs, afs_int32 * lp)
+xdrmem_putint32(XDR *xdrs, afs_int32 * lp)
 {
     if (xdrs->x_handy < sizeof(afs_int32))
        return (FALSE);
@@ -115,7 +124,7 @@ xdrmem_putint32(register XDR * xdrs, afs_int32 * lp)
 }
 
 static bool_t
-xdrmem_getbytes(register XDR * xdrs, caddr_t addr, register u_int len)
+xdrmem_getbytes(XDR *xdrs, caddr_t addr, u_int len)
 {
     if (xdrs->x_handy < len)
        return (FALSE);
@@ -127,7 +136,7 @@ xdrmem_getbytes(register XDR * xdrs, caddr_t addr, register u_int len)
 }
 
 static bool_t
-xdrmem_putbytes(register XDR * xdrs, caddr_t addr, register u_int len)
+xdrmem_putbytes(XDR *xdrs, caddr_t addr, u_int len)
 {
     if (xdrs->x_handy < len)
        return (FALSE);
@@ -139,34 +148,33 @@ xdrmem_putbytes(register XDR * xdrs, caddr_t addr, register u_int len)
 }
 
 static u_int
-xdrmem_getpos(register XDR * xdrs)
+xdrmem_getpos(XDR *xdrs)
 {
-    return ((u_int) xdrs->x_private - (u_int) xdrs->x_base);
+    return ((u_int)(xdrs->x_private - xdrs->x_base));
 }
 
 static bool_t
-xdrmem_setpos(register XDR * xdrs, u_int pos)
+xdrmem_setpos(XDR *xdrs, u_int pos)
 {
-    register caddr_t newaddr = xdrs->x_base + pos;
-    register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy;
+    caddr_t newaddr = xdrs->x_base + pos;
+    caddr_t lastaddr = xdrs->x_private + xdrs->x_handy;
 
-    if ((afs_int32) newaddr > (afs_int32) lastaddr)
+    if (newaddr > lastaddr)
        return (FALSE);
     xdrs->x_private = newaddr;
-    xdrs->x_handy = (int)lastaddr - (int)newaddr;
+    xdrs->x_handy = (int)(lastaddr - newaddr);
     return (TRUE);
 }
 
 static afs_int32 *
-xdrmem_inline(register XDR * xdrs, int len)
+xdrmem_inline(XDR *xdrs, u_int len)
 {
     afs_int32 *buf = 0;
 
-    if (len >= 0 && xdrs->x_handy >= len) {
+    if (xdrs->x_handy >= len) {
        xdrs->x_handy -= len;
        buf = (afs_int32 *) xdrs->x_private;
        xdrs->x_private += len;
     }
     return (buf);
 }
-#endif /* NeXT */