rproc_handle_resources() trusts table_ptr->num when it walks the offset[]
array, but it does not first verify that the loaded resource table is
large enough to actually contain that many offsets. A malformed firmware
image can therefore force the loop to read past the end of the table
header before any per-entry bounds checks run.

Reject resource tables whose offset array does not fit inside the loaded
section.

Signed-off-by: Pengpeng Hou <[email protected]>
---
 drivers/remoteproc/remoteproc_core.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/remoteproc/remoteproc_core.c 
b/drivers/remoteproc/remoteproc_core.c
index b087ed21858a..47fdfe5c2124 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -1022,6 +1022,12 @@ static int rproc_handle_resources(struct rproc *rproc,
        if (!rproc->table_ptr)
                return 0;
 
+       if (struct_size(rproc->table_ptr, offset,
+                       rproc->table_ptr->num) > rproc->table_sz) {
+               dev_err(dev, "resource table is truncated\n");
+               return -EINVAL;
+       }
+
        for (i = 0; i < rproc->table_ptr->num; i++) {
                int offset = rproc->table_ptr->offset[i];
                struct fw_rsc_hdr *hdr = (void *)rproc->table_ptr + offset;
-- 
2.50.1 (Apple Git-155)


Reply via email to