From 22cc57556161a28b2141976ff578db2558def3e1 Mon Sep 17 00:00:00 2001 From: Marcel Telka Date: Sun, 23 Apr 2017 22:04:04 +0200 Subject: 8098 Some xdr_simple(3nsl) and xdr_complex(3nsl) functions can succeed for undefined xdrs->x_op values Reviewed by: Yuri Pankov Reviewed by: Jason King Reviewed by: Vitaliy Gusev Approved by: Robert Mustacchi --- usr/src/lib/libnsl/rpc/xdr.c | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) (limited to 'usr/src/lib/libnsl/rpc/xdr.c') diff --git a/usr/src/lib/libnsl/rpc/xdr.c b/usr/src/lib/libnsl/rpc/xdr.c index 6d5095ff11..dd1314046c 100644 --- a/usr/src/lib/libnsl/rpc/xdr.c +++ b/usr/src/lib/libnsl/rpc/xdr.c @@ -33,8 +33,6 @@ * California. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * Generic XDR routines implementation. * @@ -382,12 +380,6 @@ xdr_opaque(XDR *xdrs, caddr_t cp, const uint_t cnt) uint_t rndup; char crud[BYTES_PER_XDR_UNIT]; - /* - * if no data we are done - */ - if (cnt == 0) - return (TRUE); - /* * round byte count to full xdr units */ @@ -488,7 +480,7 @@ xdr_netobj(XDR *xdrs, struct netobj *np) */ bool_t xdr_union(XDR *xdrs, enum_t *dscmp, char *unp, - const struct xdr_discrim *choices, const xdrproc_t dfault) + const struct xdr_discrim *choices, const xdrproc_t dfault) { enum_t dscm; @@ -617,38 +609,39 @@ xdr_string(XDR *xdrs, char **cpp, const uint_t maxsize) bool_t xdr_hyper(XDR *xdrs, longlong_t *hp) { - if (xdrs->x_op == XDR_ENCODE) { + switch (xdrs->x_op) { + case XDR_ENCODE: #if defined(_LONG_LONG_HTOL) if (XDR_PUTINT32(xdrs, (int *)hp) == TRUE) /* LINTED pointer cast */ return (XDR_PUTINT32(xdrs, (int *)((char *)hp + - BYTES_PER_XDR_UNIT))); + BYTES_PER_XDR_UNIT))); #else /* LINTED pointer cast */ if (XDR_PUTINT32(xdrs, (int *)((char *)hp + - BYTES_PER_XDR_UNIT)) == TRUE) + BYTES_PER_XDR_UNIT)) == TRUE) return (XDR_PUTINT32(xdrs, (int32_t *)hp)); #endif return (FALSE); - } - - if (xdrs->x_op == XDR_DECODE) { + case XDR_DECODE: #if defined(_LONG_LONG_HTOL) if (XDR_GETINT32(xdrs, (int *)hp) == FALSE || /* LINTED pointer cast */ (XDR_GETINT32(xdrs, (int *)((char *)hp + - BYTES_PER_XDR_UNIT)) == FALSE)) + BYTES_PER_XDR_UNIT)) == FALSE)) return (FALSE); #else /* LINTED pointer cast */ if ((XDR_GETINT32(xdrs, (int *)((char *)hp + - BYTES_PER_XDR_UNIT)) == FALSE) || - (XDR_GETINT32(xdrs, (int *)hp) == FALSE)) + BYTES_PER_XDR_UNIT)) == FALSE) || + (XDR_GETINT32(xdrs, (int *)hp) == FALSE)) return (FALSE); #endif return (TRUE); + case XDR_FREE: + return (TRUE); } - return (TRUE); + return (FALSE); } bool_t -- cgit v1.2.3