summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/rpc
diff options
context:
space:
mode:
authorMarcel Telka <marcel.telka@nexenta.com>2013-12-17 15:16:17 +0100
committerAlbert Lee <trisk@omniti.com>2015-05-14 13:14:57 -0400
commit3b3b7026bde850c59ef70bb86cf2ca9e8d8011fc (patch)
tree3a2e5efeadcd7ad02792da4588b1ba233afb6209 /usr/src/uts/common/rpc
parent2695d4f4d1e2a6022c8a279d40c3cb750964974d (diff)
downloadillumos-joyent-3b3b7026bde850c59ef70bb86cf2ca9e8d8011fc.tar.gz
4567 Long RPC messages could confuse kernel and cause panic
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com> Reviewed by: Jan Kryl <jan.kryl@nexenta.com> Reviewed by: Rich Lowe <richlowe@richlowe.net> Reviewed by: Robert Mustacchi <rm@joyent.com> Approved by: Albert Lee <trisk@omniti.com>
Diffstat (limited to 'usr/src/uts/common/rpc')
-rw-r--r--usr/src/uts/common/rpc/rpcmod.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/usr/src/uts/common/rpc/rpcmod.c b/usr/src/uts/common/rpc/rpcmod.c
index 09863c970f..c8e7220bc7 100644
--- a/usr/src/uts/common/rpc/rpcmod.c
+++ b/usr/src/uts/common/rpc/rpcmod.c
@@ -1017,7 +1017,7 @@ static void mir_wput(queue_t *q, mblk_t *mp);
static void mir_wput_other(queue_t *q, mblk_t *mp);
static void mir_wsrv(queue_t *q);
static void mir_disconnect(queue_t *, mir_t *ir);
-static int mir_check_len(queue_t *, int32_t, mblk_t *);
+static int mir_check_len(queue_t *, mblk_t *);
static void mir_timer(void *);
extern void (*mir_rele)(queue_t *, mblk_t *, bool_t);
@@ -1555,9 +1555,7 @@ mir_rput(queue_t *q, mblk_t *mp)
if (!mir->mir_hold_inbound) {
if (mir->mir_krpc_cell) {
- if (mir_check_len(q,
- (int32_t)msgdsize(head_mp),
- head_mp))
+ if (mir_check_len(q, head_mp))
return;
if (q->q_first == NULL &&
@@ -1614,7 +1612,7 @@ mir_rput(queue_t *q, mblk_t *mp)
* will shutdown the connection, drop mir_mutex, and return non-zero.
*/
if (head_mp != NULL && mir->mir_setup_complete &&
- mir_check_len(q, frag_len, head_mp))
+ mir_check_len(q, head_mp))
return;
/* Save our local copies back in the mir structure. */
@@ -1878,8 +1876,7 @@ mir_rsrv(queue_t *q)
if (mir->mir_krpc_cell &&
(mir->mir_svc_no_more_msgs == 0)) {
- if (mir_check_len(q,
- (int32_t)msgdsize(mp), mp))
+ if (mir_check_len(q, mp))
return;
if (svc_queuereq(q, mp, TRUE)) {
@@ -2818,15 +2815,16 @@ mir_disconnect(queue_t *q, mir_t *mir)
* connection. Returns 1 if the connection is shutdown; 0 otherwise.
*/
static int
-mir_check_len(queue_t *q, int32_t frag_len, mblk_t *head_mp)
+mir_check_len(queue_t *q, mblk_t *head_mp)
{
mir_t *mir = q->q_ptr;
uint_t maxsize = 0;
+ size_t msg_len = msgdsize(head_mp);
if (mir->mir_max_msg_sizep != NULL)
maxsize = *mir->mir_max_msg_sizep;
- if (maxsize == 0 || frag_len <= (int)maxsize)
+ if (maxsize == 0 || msg_len <= maxsize)
return (0);
freemsg(head_mp);
@@ -2836,11 +2834,11 @@ mir_check_len(queue_t *q, int32_t frag_len, mblk_t *head_mp)
mir->mir_frag_len = -(int32_t)sizeof (uint32_t);
if (mir->mir_type != RPC_SERVER || mir->mir_setup_complete) {
cmn_err(CE_NOTE,
- "kRPC: record fragment from %s of size(%d) exceeds "
+ "kRPC: record fragment from %s of size(%lu) exceeds "
"maximum (%u). Disconnecting",
(mir->mir_type == RPC_CLIENT) ? "server" :
(mir->mir_type == RPC_SERVER) ? "client" :
- "test tool", frag_len, maxsize);
+ "test tool", msg_len, maxsize);
}
mir_disconnect(q, mir);