hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/firmware/arm_scmi/shmem.c
....@@ -58,10 +58,11 @@
5858 void shmem_fetch_response(struct scmi_shared_mem __iomem *shmem,
5959 struct scmi_xfer *xfer)
6060 {
61
+ size_t len = ioread32(&shmem->length);
62
+
6163 xfer->hdr.status = ioread32(shmem->msg_payload);
6264 /* Skip the length of header and status in shmem area i.e 8 bytes */
63
- xfer->rx.len = min_t(size_t, xfer->rx.len,
64
- ioread32(&shmem->length) - 8);
65
+ xfer->rx.len = min_t(size_t, xfer->rx.len, len > 8 ? len - 8 : 0);
6566
6667 /* Take a copy to the rx buffer.. */
6768 memcpy_fromio(xfer->rx.buf, shmem->msg_payload + 4, xfer->rx.len);
....@@ -70,8 +71,10 @@
7071 void shmem_fetch_notification(struct scmi_shared_mem __iomem *shmem,
7172 size_t max_len, struct scmi_xfer *xfer)
7273 {
74
+ size_t len = ioread32(&shmem->length);
75
+
7376 /* Skip only the length of header in shmem area i.e 4 bytes */
74
- xfer->rx.len = min_t(size_t, max_len, ioread32(&shmem->length) - 4);
77
+ xfer->rx.len = min_t(size_t, max_len, len > 4 ? len - 4 : 0);
7578
7679 /* Take a copy to the rx buffer.. */
7780 memcpy_fromio(xfer->rx.buf, shmem->msg_payload, xfer->rx.len);