summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/lib/libnsl/rpc/rpc_callmsg.c37
-rw-r--r--usr/src/uts/common/rpc/rpc_calmsg.c25
2 files changed, 36 insertions, 26 deletions
diff --git a/usr/src/lib/libnsl/rpc/rpc_callmsg.c b/usr/src/lib/libnsl/rpc/rpc_callmsg.c
index 20dcf02e49..3a0e8859f8 100644
--- a/usr/src/lib/libnsl/rpc/rpc_callmsg.c
+++ b/usr/src/lib/libnsl/rpc/rpc_callmsg.c
@@ -33,8 +33,6 @@
* California.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include "mt.h"
#include <stdlib.h>
#include <sys/param.h>
@@ -54,14 +52,17 @@ xdr_callmsg(XDR *xdrs, struct rpc_msg *cmsg)
struct opaque_auth *oa;
if (xdrs->x_op == XDR_ENCODE) {
+ uint_t credrndup;
+ uint_t verfrndup;
+
if (cmsg->rm_call.cb_cred.oa_length > MAX_AUTH_BYTES)
return (FALSE);
if (cmsg->rm_call.cb_verf.oa_length > MAX_AUTH_BYTES)
return (FALSE);
- buf = XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT
- + RNDUP(cmsg->rm_call.cb_cred.oa_length)
- + 2 * BYTES_PER_XDR_UNIT
- + RNDUP(cmsg->rm_call.cb_verf.oa_length));
+ credrndup = RNDUP(cmsg->rm_call.cb_cred.oa_length);
+ verfrndup = RNDUP(cmsg->rm_call.cb_verf.oa_length);
+ buf = XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT +
+ credrndup + 2 * BYTES_PER_XDR_UNIT + verfrndup);
if (buf != NULL) {
IXDR_PUT_INT32(buf, cmsg->rm_xid);
IXDR_PUT_ENUM(buf, cmsg->rm_direction);
@@ -78,18 +79,20 @@ xdr_callmsg(XDR *xdrs, struct rpc_msg *cmsg)
IXDR_PUT_INT32(buf, oa->oa_length);
if (oa->oa_length) {
(void) memcpy(buf, oa->oa_base, oa->oa_length);
- buf += RNDUP(oa->oa_length) / sizeof (int32_t);
+ buf += credrndup / BYTES_PER_XDR_UNIT;
+ if ((credrndup -= oa->oa_length) > 0)
+ (void) memset((char *)buf - credrndup,
+ 0, credrndup);
}
oa = &cmsg->rm_call.cb_verf;
IXDR_PUT_ENUM(buf, oa->oa_flavor);
IXDR_PUT_INT32(buf, oa->oa_length);
if (oa->oa_length) {
(void) memcpy(buf, oa->oa_base, oa->oa_length);
- /*
- * no real need....
- * buf += RNDUP(oa->oa_length) / sizeof
- * (int32_t);
- */
+ buf += verfrndup / BYTES_PER_XDR_UNIT;
+ if ((verfrndup -= oa->oa_length) > 0)
+ (void) memset((char *)buf - verfrndup,
+ 0, verfrndup);
}
return (TRUE);
}
@@ -116,9 +119,8 @@ xdr_callmsg(XDR *xdrs, struct rpc_msg *cmsg)
if (oa->oa_base == NULL) {
oa->oa_base = malloc(oa->oa_length);
if (oa->oa_base == NULL) {
- syslog(LOG_ERR,
- "xdr_callmsg : "
- "out of memory.");
+ syslog(LOG_ERR, "xdr_callmsg : "
+ "out of memory.");
return (FALSE);
}
}
@@ -153,9 +155,8 @@ xdr_callmsg(XDR *xdrs, struct rpc_msg *cmsg)
if (oa->oa_base == NULL) {
oa->oa_base = malloc(oa->oa_length);
if (oa->oa_base == NULL) {
- syslog(LOG_ERR,
- "xdr_callmsg : "
- "out of memory.");
+ syslog(LOG_ERR, "xdr_callmsg : "
+ "out of memory.");
return (FALSE);
}
}
diff --git a/usr/src/uts/common/rpc/rpc_calmsg.c b/usr/src/uts/common/rpc/rpc_calmsg.c
index aab72d1ab4..0094de6df4 100644
--- a/usr/src/uts/common/rpc/rpc_calmsg.c
+++ b/usr/src/uts/common/rpc/rpc_calmsg.c
@@ -32,8 +32,6 @@
* under license from the Regents of the University of California.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* rpc_calmsg.c
*/
@@ -55,18 +53,21 @@
bool_t
xdr_callmsg(XDR *xdrs, struct rpc_msg *cmsg)
{
- int32_t *buf;
+ rpc_inline_t *buf;
struct opaque_auth *oa;
if (xdrs->x_op == XDR_ENCODE) {
+ uint_t credrndup;
+ uint_t verfrndup;
+
if (cmsg->rm_call.cb_cred.oa_length > MAX_AUTH_BYTES)
return (FALSE);
if (cmsg->rm_call.cb_verf.oa_length > MAX_AUTH_BYTES)
return (FALSE);
+ credrndup = RNDUP(cmsg->rm_call.cb_cred.oa_length);
+ verfrndup = RNDUP(cmsg->rm_call.cb_verf.oa_length);
buf = XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT +
- RNDUP(cmsg->rm_call.cb_cred.oa_length) +
- 2 * BYTES_PER_XDR_UNIT +
- RNDUP(cmsg->rm_call.cb_verf.oa_length));
+ credrndup + 2 * BYTES_PER_XDR_UNIT + verfrndup);
if (buf != NULL) {
IXDR_PUT_INT32(buf, cmsg->rm_xid);
IXDR_PUT_ENUM(buf, cmsg->rm_direction);
@@ -83,13 +84,21 @@ xdr_callmsg(XDR *xdrs, struct rpc_msg *cmsg)
IXDR_PUT_INT32(buf, oa->oa_length);
if (oa->oa_length) {
bcopy(oa->oa_base, buf, oa->oa_length);
- buf += RNDUP(oa->oa_length) / sizeof (int32_t);
+ buf += credrndup / BYTES_PER_XDR_UNIT;
+ if ((credrndup -= oa->oa_length) > 0)
+ bzero((char *)buf - credrndup,
+ credrndup);
}
oa = &cmsg->rm_call.cb_verf;
IXDR_PUT_ENUM(buf, oa->oa_flavor);
IXDR_PUT_INT32(buf, oa->oa_length);
- if (oa->oa_length)
+ if (oa->oa_length) {
bcopy(oa->oa_base, buf, oa->oa_length);
+ buf += verfrndup / BYTES_PER_XDR_UNIT;
+ if ((verfrndup -= oa->oa_length) > 0)
+ bzero((char *)buf - verfrndup,
+ verfrndup);
+ }
return (TRUE);
}
}