]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
of: address: Fix empty resource handling in __of_address_resource_bounds()
authorThomas Weißschuh <thomas.weissschuh@linutronix.de>
Mon, 20 Jan 2025 14:09:40 +0000 (15:09 +0100)
committerRob Herring (Arm) <robh@kernel.org>
Fri, 24 Jan 2025 21:59:23 +0000 (15:59 -0600)
"resource->end" needs to always be equal to "resource->start + size - 1".
The previous version of the function did not perform the "- 1" in case
of an empty resource.

Also make sure to allow an empty resource at address 0.

Reported-by: Basharath Hussain Khaja <basharath@couthit.com>
Closes: https://lore.kernel.org/lkml/20250108140414.13530-1-basharath@couthit.com/
Fixes: 1a52a094c2f0 ("of: address: Unify resource bounds overflow checking")
Cc: stable@vger.kernel.org
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Link: https://lore.kernel.org/r/20250120-of-address-overflow-v1-1-dd68dbf47bce@linutronix.de
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
drivers/of/address.c

index 6c40f96a19610c19d9594a9605fd9a2fa2c97cd4..26f7fc3d759976539dbd05fb07fe25b27ae4faa7 100644 (file)
@@ -185,17 +185,15 @@ static u64 of_bus_pci_map(__be32 *addr, const __be32 *range, int na, int ns,
 
 static int __of_address_resource_bounds(struct resource *r, u64 start, u64 size)
 {
-       u64 end = start;
-
        if (overflows_type(start, r->start))
                return -EOVERFLOW;
-       if (size && check_add_overflow(end, size - 1, &end))
-               return -EOVERFLOW;
-       if (overflows_type(end, r->end))
-               return -EOVERFLOW;
 
        r->start = start;
-       r->end = end;
+
+       if (!size)
+               r->end = wrapping_sub(typeof(r->end), r->start, 1);
+       else if (size && check_add_overflow(r->start, size - 1, &r->end))
+               return -EOVERFLOW;
 
        return 0;
 }