Skip to content

Commit 51b5638

Browse files
Dan Carpenterquic-jhugo
authored andcommitted
accel/qaic: tighten bounds checking in decode_message()
Copy the bounds checking from encode_message() to decode_message(). This patch addresses the following concerns. Ensure that there is enough space for at least one header so that we don't have a negative size later. if (msg_hdr_len < sizeof(*trans_hdr)) Ensure that we have enough space to read the next header from the msg->data. if (msg_len > msg_hdr_len - sizeof(*trans_hdr)) return -EINVAL; Check that the trans_hdr->len is not below the minimum size: if (hdr_len < sizeof(*trans_hdr)) This minimum check ensures that we don't corrupt memory in decode_passthrough() when we do. memcpy(out_trans->data, in_trans->data, len - sizeof(in_trans->hdr)); And finally, use size_add() to prevent an integer overflow: if (size_add(msg_len, hdr_len) > msg_hdr_len) Fixes: 129776a ("accel/qaic: Add control path") Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org> Reviewed-by: Pranjal Ramajor Asha Kanojiya <quic_pkanojiy@quicinc.com> Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com> Cc: stable@vger.kernel.org # 6.4.x Signed-off-by: Jeffrey Hugo <quic_jhugo@quicinc.com> Link: https://patchwork.freedesktop.org/patch/msgid/ZK0Q5nbLyDO7kJa+@moroto
1 parent ea33cb6 commit 51b5638

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

drivers/accel/qaic/qaic_control.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -956,15 +956,23 @@ static int decode_message(struct qaic_device *qdev, struct manage_msg *user_msg,
956956
int ret;
957957
int i;
958958

959-
if (msg_hdr_len > QAIC_MANAGE_MAX_MSG_LENGTH)
959+
if (msg_hdr_len < sizeof(*trans_hdr) ||
960+
msg_hdr_len > QAIC_MANAGE_MAX_MSG_LENGTH)
960961
return -EINVAL;
961962

962963
user_msg->len = 0;
963964
user_msg->count = le32_to_cpu(msg->hdr.count);
964965

965966
for (i = 0; i < user_msg->count; ++i) {
967+
u32 hdr_len;
968+
969+
if (msg_len > msg_hdr_len - sizeof(*trans_hdr))
970+
return -EINVAL;
971+
966972
trans_hdr = (struct wire_trans_hdr *)(msg->data + msg_len);
967-
if (msg_len + le32_to_cpu(trans_hdr->len) > msg_hdr_len)
973+
hdr_len = le32_to_cpu(trans_hdr->len);
974+
if (hdr_len < sizeof(*trans_hdr) ||
975+
size_add(msg_len, hdr_len) > msg_hdr_len)
968976
return -EINVAL;
969977

970978
switch (le32_to_cpu(trans_hdr->type)) {

0 commit comments

Comments
 (0)