Skip to content

Commit

Permalink
of: address: Fix empty resource handling in __of_address_resource_bou…
Browse files Browse the repository at this point in the history
…nds()

"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: 1a52a09 ("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>
  • Loading branch information
Thomas Weißschuh authored and Rob Herring (Arm) committed Jan 24, 2025
1 parent 14bce18 commit 15e2f65
Showing 1 changed file with 5 additions and 7 deletions.
12 changes: 5 additions & 7 deletions drivers/of/address.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down

0 comments on commit 15e2f65

Please sign in to comment.