summaryrefslogtreecommitdiff
path: root/include/linux/rsc_table.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/rsc_table.h')
-rw-r--r--include/linux/rsc_table.h17
1 files changed, 11 insertions, 6 deletions
diff --git a/include/linux/rsc_table.h b/include/linux/rsc_table.h
index 0ad9122c22af..71b60125310e 100644
--- a/include/linux/rsc_table.h
+++ b/include/linux/rsc_table.h
@@ -310,17 +310,22 @@ static inline int rsc_table_for_each_entry(struct resource_table *table,
int i, ret;
for (i = 0; i < table->num; i++) {
- int offset = table->offset[i];
- struct fw_rsc_hdr *hdr = (void *)table + offset;
- int avail = table_sz - offset - sizeof(*hdr);
- int rsc_offset = offset + sizeof(*hdr);
- void *rsc = (void *)hdr + sizeof(*hdr);
+ u32 offset = table->offset[i];
+ struct fw_rsc_hdr *hdr;
+ int avail, rsc_offset;
+ void *rsc;
- if (avail < 0) {
+ if (offset < sizeof(*table) || offset >= table_sz ||
+ table_sz - offset < sizeof(*hdr)) {
dev_err(dev, "rsc table is truncated\n");
return -EINVAL;
}
+ hdr = (void *)table + offset;
+ avail = table_sz - offset - sizeof(*hdr);
+ rsc_offset = offset + sizeof(*hdr);
+ rsc = (void *)hdr + sizeof(*hdr);
+
ret = cb(hdr->type, rsc, rsc_offset, avail, data);
if (ret)
return ret;