diff options
author | Mario Six <mario.six@gdsys.cc> | 2018-10-04 09:00:43 +0200 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2018-11-14 09:16:27 -0800 |
commit | b6f58bfd6d2ce35360d3993be8d07e494e33021e (patch) | |
tree | c45477f9b91d463c69c7bc4328aab47f882f3e6b /drivers/core | |
parent | 9b076095636b7def91ed6fd3f94383155057e962 (diff) |
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>
Diffstat (limited to 'drivers/core')
-rw-r--r-- | drivers/core/regmap.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c index 77f6f520a0..4ebab23349 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) |