| .. | .. | 
|---|
| 58 | 58 | void shmem_fetch_response(struct scmi_shared_mem __iomem *shmem, | 
|---|
| 59 | 59 | struct scmi_xfer *xfer) | 
|---|
| 60 | 60 | { | 
|---|
|  | 61 | +	size_t len = ioread32(&shmem->length); | 
|---|
|  | 62 | + | 
|---|
| 61 | 63 | xfer->hdr.status = ioread32(shmem->msg_payload); | 
|---|
| 62 | 64 | /* 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); | 
|---|
| 65 | 66 |  | 
|---|
| 66 | 67 | /* Take a copy to the rx buffer.. */ | 
|---|
| 67 | 68 | memcpy_fromio(xfer->rx.buf, shmem->msg_payload + 4, xfer->rx.len); | 
|---|
| .. | .. | 
|---|
| 70 | 71 | void shmem_fetch_notification(struct scmi_shared_mem __iomem *shmem, | 
|---|
| 71 | 72 | size_t max_len, struct scmi_xfer *xfer) | 
|---|
| 72 | 73 | { | 
|---|
|  | 74 | +	size_t len = ioread32(&shmem->length); | 
|---|
|  | 75 | + | 
|---|
| 73 | 76 | /* 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); | 
|---|
| 75 | 78 |  | 
|---|
| 76 | 79 | /* Take a copy to the rx buffer.. */ | 
|---|
| 77 | 80 | memcpy_fromio(xfer->rx.buf, shmem->msg_payload, xfer->rx.len); | 
|---|