summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEder Zulian <ezulian@redhat.com>2025-02-12 21:45:24 +0300
committerLee Jones <lee@kernel.org>2025-03-14 11:59:07 +0300
commitba09916efb29f80e438a54e634970209ce12750f (patch)
treea65dcb615f5ebc2dfcc5d1fd2a1511ee631426f5
parent860e98066f5ef2b87a5df7b575a85a4d57adb5e1 (diff)
downloadlinux-ba09916efb29f80e438a54e634970209ce12750f.tar.xz
mfd: syscon: Add check for invalid resource size
Add a consistency check to avoid assigning an invalid value to max_register due to a possible DT misconfiguration. Suggested-by: Mark Langsdorf <mlangsdo@redhat.com> Signed-off-by: Eder Zulian <ezulian@redhat.com> Link: https://lore.kernel.org/r/20250212184524.585882-1-ezulian@redhat.com Signed-off-by: Lee Jones <lee@kernel.org>
-rw-r--r--drivers/mfd/syscon.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c
index 226915ca3c93..362824a7e350 100644
--- a/drivers/mfd/syscon.c
+++ b/drivers/mfd/syscon.c
@@ -47,6 +47,7 @@ static struct syscon *of_syscon_register(struct device_node *np, bool check_res)
struct regmap_config syscon_config = syscon_regmap_config;
struct resource res;
struct reset_control *reset;
+ resource_size_t res_size;
WARN_ON(!mutex_is_locked(&syscon_list_lock));
@@ -96,6 +97,12 @@ static struct syscon *of_syscon_register(struct device_node *np, bool check_res)
}
}
+ res_size = resource_size(&res);
+ if (res_size < reg_io_width) {
+ ret = -EFAULT;
+ goto err_regmap;
+ }
+
syscon_config.name = kasprintf(GFP_KERNEL, "%pOFn@%pa", np, &res.start);
if (!syscon_config.name) {
ret = -ENOMEM;
@@ -103,7 +110,7 @@ static struct syscon *of_syscon_register(struct device_node *np, bool check_res)
}
syscon_config.reg_stride = reg_io_width;
syscon_config.val_bits = reg_io_width * 8;
- syscon_config.max_register = resource_size(&res) - reg_io_width;
+ syscon_config.max_register = res_size - reg_io_width;
if (!syscon_config.max_register)
syscon_config.max_register_is_0 = true;