regmap: Improve error handling
authorMario Six <mario.six@gdsys.cc>
Thu, 4 Oct 2018 07:00:43 +0000 (09:00 +0200)
committerSimon Glass <sjg@chromium.org>
Wed, 14 Nov 2018 17:16:27 +0000 (09:16 -0800)
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>
drivers/core/regmap.c

index 77f6f520a0657fd50787ab2f5e22d32bba772c68..4ebab23349081f892323067c918cb834cc9a62c6 100644 (file)
@@ -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)