mei: limit number of bytes in mei header.
authorTomas Winkler <tomas.winkler@intel.com>
Tue, 11 Feb 2020 16:05:22 +0000 (18:05 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 11 Feb 2020 22:03:19 +0000 (14:03 -0800)
The MEI message header provides only 9 bits for storing
the message size, limiting to 511.
In theory the host buffer (hbuf) can contain up to 1020 bytes
(limited by byte =  255 * 4)
With the current hardware and hbuf size 512, this is not a real issue,
but as hardening approach we enforce the limit.

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Link: https://lore.kernel.org/r/20200211160522.7562-1-tomas.winkler@intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/mei/client.c
drivers/misc/mei/hw.h

index 1e3edbbacb1e29d35babd37dcdfb8867ef4c1c26..204d807e755b4d639bd9ea80279077104d336b7e 100644 (file)
@@ -1585,7 +1585,7 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
                goto err;
        }
 
-       hbuf_len = mei_slots2data(hbuf_slots);
+       hbuf_len = mei_slots2data(hbuf_slots) & MEI_MSG_MAX_LEN_MASK;
        dr_slots = mei_dma_ring_empty_slots(dev);
        dr_len = mei_slots2data(dr_slots);
 
@@ -1718,7 +1718,7 @@ ssize_t mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb)
                goto out;
        }
 
-       hbuf_len = mei_slots2data(hbuf_slots);
+       hbuf_len = mei_slots2data(hbuf_slots) & MEI_MSG_MAX_LEN_MASK;
        dr_slots = mei_dma_ring_empty_slots(dev);
        dr_len =  mei_slots2data(dr_slots);
 
index d025a5f8317e080b7880952384b3d360f1776ab6..8231b6941adf837581f1b4e6d3fa7b2d7413c68b 100644 (file)
@@ -209,6 +209,9 @@ struct mei_msg_hdr {
        u32 extension[0];
 } __packed;
 
+/* The length is up to 9 bits */
+#define MEI_MSG_MAX_LEN_MASK GENMASK(9, 0)
+
 #define MEI_MSG_HDR_MAX 2
 
 struct mei_bus_message {