[openib-general] [PATCH] user_mad.c::ib_umad_write don't go past end of user buffer
Hal Rosenstock
halr at voltaire.com
Mon Sep 19 10:44:18 PDT 2005
user_mad.c::ib_umad_write don't go past end of user buffer
Fix to previous fix for length of user buffer copied when sending RMPP
Signed-off-by: Hal Rosenstock <halr at voltaire.com>
Index: user_mad.c
===================================================================
--- user_mad.c (revision 3480)
+++ user_mad.c (working copy)
@@ -273,7 +273,6 @@ static ssize_t ib_umad_write(struct file
u8 method;
__be64 *tid;
int ret, length, hdr_len, data_len, rmpp_hdr_size;
- int class_hdr_len = 0;
int rmpp_active = 0;
if (count < sizeof (struct ib_user_mad))
@@ -335,16 +334,15 @@ static ssize_t ib_umad_write(struct file
ret = -EINVAL;
goto err_ah;
}
+
/* Validate that the management class can support RMPP */
if (rmpp_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_ADM) {
hdr_len = offsetof(struct ib_sa_mad, data);
- data_len = length;
- class_hdr_len = sizeof(struct ib_sa_hdr);
+ data_len = length - hdr_len;
} else if ((rmpp_mad->mad_hdr.mgmt_class >= IB_MGMT_CLASS_VENDOR_RANGE2_START) &&
(rmpp_mad->mad_hdr.mgmt_class <= IB_MGMT_CLASS_VENDOR_RANGE2_END)) {
hdr_len = offsetof(struct ib_vendor_mad, data);
data_len = length - hdr_len;
- class_hdr_len = 4;
} else {
ret = -EINVAL;
goto err_ah;
@@ -393,7 +391,7 @@ static ssize_t ib_umad_write(struct file
/* Now, copy rest of message from user into send buffer */
if (copy_from_user(((struct ib_rmpp_mad *) packet->msg->mad)->data,
buf + sizeof (struct ib_user_mad) + rmpp_hdr_size,
- length + class_hdr_len)) {
+ length - rmpp_hdr_size)) {
ret = -EFAULT;
goto err_msg;
}
More information about the general
mailing list