Date: Thu, 6 Apr 2000 12:40:03 -0700 (PDT) From: "David E. Cross" <crossd@cs.rpi.edu> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/17681: XDR does not handle 64bit data types correctly Message-ID: <200004061940.MAA78198@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/17681; it has been noted by GNATS. From: "David E. Cross" <crossd@cs.rpi.edu> To: Sheldon Hearn <sheldonh@uunet.co.za> Cc: "David E. Cross" <crossd@cs.rpi.edu>, FreeBSD-gnats-submit@FreeBSD.ORG, crossd@cs.rpi.edu Subject: Re: bin/17681: XDR does not handle 64bit data types correctly Date: Thu, 06 Apr 2000 14:19:01 -0400 Hmm.. I feel one of us is probably doing something stupid :) This is a bit long as it includes the multiple copies of the source to try to clear things up (only the XDR64 routines are here, as that is the only thing I touched.) The XDR patch that I gave out only touches the 64bit routines in the XDR library, so here is the XDR library before my patch: /* * XDR 64-bit integers */ bool_t xdr_int64_t(xdrs, int64_p) register XDR *xdrs; int64_t *int64_p; { int64_t x; switch (xdrs->x_op) { case XDR_ENCODE: return (xdr_opaque(xdrs, (caddr_t)int64_p, sizeof(int64_t))); case XDR_DECODE: if (!xdr_opaque(xdrs, (caddr_t)&x, sizeof x)) { return (FALSE); } *int64_p = x; return (TRUE); case XDR_FREE: return (TRUE); } return (FALSE); } /* * XDR unsigned 64-bit integers */ bool_t xdr_u_int64_t(xdrs, uint64_p) register XDR *xdrs; u_int64_t *uint64_p; { u_int64_t x; switch (xdrs->x_op) { case XDR_ENCODE: return (xdr_opaque(xdrs, (caddr_t)uint64_p, sizeof(u_int64_t))); case XDR_DECODE: if (!xdr_opaque(xdrs, (caddr_t)&x, sizeof x)) { return (FALSE); } *uint64_p = x; return (TRUE); case XDR_FREE: return (TRUE); } return (FALSE); } The following is from: http://www.freebsd.org/cgi/cvsweb.cgi/basesrc/lib/libc/rpc/xdr.c?rev=1.21&cvsroot=netbsd /* * XDR 64-bit integers */ bool_t xdr_int64_t(xdrs, llp) XDR *xdrs; int64_t *llp; { u_long ul[2]; switch (xdrs->x_op) { case XDR_ENCODE: ul[0] = (u_long)((u_int64_t)*llp >> 32) & 0xffffffff; ul[1] = (u_long)((u_int64_t)*llp) & 0xffffffff; if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE) return (FALSE); return (XDR_PUTLONG(xdrs, (long *)&ul[1])); case XDR_DECODE: if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE) return (FALSE); if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE) return (FALSE); *llp = (int64_t) (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1])); return (TRUE); case XDR_FREE: return (TRUE); } /* NOTREACHED */ return (FALSE); } /* * XDR unsigned 64-bit integers */ bool_t xdr_u_int64_t(xdrs, ullp) XDR *xdrs; u_int64_t *ullp; { u_long ul[2]; switch (xdrs->x_op) { case XDR_ENCODE: ul[0] = (u_long)(*ullp >> 32) & 0xffffffff; ul[1] = (u_long)(*ullp) & 0xffffffff; if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE) return (FALSE); return (XDR_PUTLONG(xdrs, (long *)&ul[1])); case XDR_DECODE: if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE) return (FALSE); if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE) return (FALSE); *ullp = (u_int64_t) (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1])); return (TRUE); case XDR_FREE: return (TRUE); } /* NOTREACHED */ return (FALSE); } The following is a result of: patch <xdr.diff /* * XDR 64-bit integers */ bool_t xdr_int64_t(xdrs, int64_p) register XDR *xdrs; int64_t *int64_p; { u_long ul[2]; switch (xdrs->x_op) { case XDR_ENCODE: ul[0] = (u_long)((u_int64_t)*int64_p >> 32) & 0xffffffff; ul[1] = (u_long)((u_int64_t)*int64_p) & 0xffffffff; if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE) return (FALSE); return (XDR_PUTLONG(xdrs, (long *)&ul[1])); case XDR_DECODE: if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE) return (FALSE); if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE) return (FALSE); *int64_p = (int64_t) (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1])); return (TRUE); case XDR_FREE: return (TRUE); } return (FALSE); } /* * XDR unsigned 64-bit integers */ bool_t xdr_u_int64_t(xdrs, uint64_p) register XDR *xdrs; u_int64_t *uint64_p; { u_long ul[2]; switch (xdrs->x_op) { case XDR_ENCODE: ul[0] = (u_long)(*int64_p >> 32) & 0xffffffff; ul[1] = (u_long)(*int64_p) & 0xffffffff; if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE) return (FALSE); return (XDR_PUTLONG(xdrs, (long *)&ul[1])); case XDR_DECODE: if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE) return (FALSE); if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE) return (FALSE); *int64_p = (u_int64_t) (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1])); return (TRUE); case XDR_FREE: return (TRUE); } return (FALSE); } So, if we save the NetBSD and the patched FreeBSD xdr.c (just the XDR64 routeines) to a file, and diff them we get: 1,2d0 < < 7,9c5,7 < xdr_int64_t(xdrs, llp) < XDR *xdrs; < int64_t *llp; --- > xdr_int64_t(xdrs, int64_p) > register XDR *xdrs; > int64_t *int64_p; 13a12 > 15,16c14,15 < ul[0] = (u_long)((u_int64_t)*llp >> 32) & 0xffffffff; < ul[1] = (u_long)((u_int64_t)*llp) & 0xffffffff; --- > ul[0] = (u_long)((u_int64_t)*int64_p >> 32) & 0xffffffff; > ul[1] = (u_long)((u_int64_t)*int64_p) & 0xffffffff; 25,26c24,25 < *llp = (int64_t) < (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1])); --- > *int64_p = (int64_t) > (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1])); 31d29 < /* NOTREACHED */ 35d32 < 40,42c37,39 < xdr_u_int64_t(xdrs, ullp) < XDR *xdrs; < u_int64_t *ullp; --- > xdr_u_int64_t(xdrs, uint64_p) > register XDR *xdrs; > u_int64_t *uint64_p; 46a44 > 48,49c46,47 < ul[0] = (u_long)(*ullp >> 32) & 0xffffffff; < ul[1] = (u_long)(*ullp) & 0xffffffff; --- > ul[0] = (u_long)(*int64_p >> 32) & 0xffffffff; > ul[1] = (u_long)(*int64_p) & 0xffffffff; 52a51 > 58,59c57,58 < *ullp = (u_int64_t) < (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1])); --- > *int64_p = (u_int64_t) > (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1])); 64d62 < /* NOTREACHED */ The only differences that I am seeing in the file are naming conventions. I decided to stick with ours. The NetBSD people have the 64bit type as the long long and the unsigned long long, where we have the int64_t and u_int64_t. They make mention of this being non-portable, and thus in its own secion. As we have the 'int64_t' I decided to stick with it. I will ask the lockd devloper to do an additional set of runs just to make absolutely, 100%, definitely, undeniably, sure. -- David Cross | email: crossd@cs.rpi.edu Lab Director | Rm: 308 Lally Hall Rensselaer Polytechnic Institute, | Ph: 518.276.2860 Department of Computer Science | Fax: 518.276.4033 I speak only for myself. | WinNT:Linux::Linux:FreeBSD To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200004061940.MAA78198>