aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMario Six <mario.six@gdsys.cc>2018-10-04 09:00:43 +0200
committerSimon Glass <sjg@chromium.org>2018-11-14 09:16:27 -0800
commitb6f58bfd6d2ce35360d3993be8d07e494e33021e (patch)
treec45477f9b91d463c69c7bc4328aab47f882f3e6b
parent9b076095636b7def91ed6fd3f94383155057e962 (diff)
downloadu-boot-b6f58bfd6d2ce35360d3993be8d07e494e33021e.zip
u-boot-b6f58bfd6d2ce35360d3993be8d07e494e33021e.tar.gz
u-boot-b6f58bfd6d2ce35360d3993be8d07e494e33021e.tar.bz2
regmap: Improve error handling
ofnode_read_simple_addr_cells may fail and return a negative error code. Check for this when initializing regmaps. Also check if both_len is zero, since this is perfectly possible, and would lead to a division-by-zero further down the line. Reviewed-by: Anatolij Gustschin <agust@denx.de> Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Mario Six <mario.six@gdsys.cc>
-rw-r--r--drivers/core/regmap.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c
index 77f6f52..4ebab23 100644
--- a/drivers/core/regmap.c
+++ b/drivers/core/regmap.c
@@ -67,8 +67,25 @@ int regmap_init_mem(ofnode node, struct regmap **mapp)
struct resource r;
addr_len = ofnode_read_simple_addr_cells(ofnode_get_parent(node));
+ if (addr_len < 0) {
+ debug("%s: Error while reading the addr length (ret = %d)\n",
+ ofnode_get_name(node), addr_len);
+ return addr_len;
+ }
+
size_len = ofnode_read_simple_size_cells(ofnode_get_parent(node));
+ if (size_len < 0) {
+ debug("%s: Error while reading the size length: (ret = %d)\n",
+ ofnode_get_name(node), size_len);
+ return size_len;
+ }
+
both_len = addr_len + size_len;
+ if (!both_len) {
+ debug("%s: Both addr and size length are zero\n",
+ ofnode_get_name(node));
+ return -EINVAL;
+ }
len = ofnode_read_size(node, "reg");
if (len < 0)