[PATCH v4 4/5] mm/memory-failure: efi: answer whether a range is poisoned

sashiko-bot at kernel.org sashiko-bot at kernel.org
Wed Sep 9 06:17:18 PDT 2026


Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Adjusting `start` without proportionally shrinking `size` shifts the checked memory range out of bounds, causing false positive poison detection.
--

commit b492314fda14ef47eff8ff738b90a4749a490163
Author: Breno Leitao <leitao at debian.org>

mm/memory-failure: efi: answer whether a range is poisoned

This commit introduces range_contains_poisoned_memory() which allows the
page allocator to query whether a memory block overlaps with regions
recorded as poisoned by an earlier kernel via EFI.

> diff --git a/drivers/firmware/efi/poison.c b/drivers/firmware/efi/poison.c
> index c18edf111c710..e16d43f4438ee 100644
> --- a/drivers/firmware/efi/poison.c
> +++ b/drivers/firmware/efi/poison.c
[ ... ]
> +/* Does the range cover a unit an earlier kernel recorded as bad? */
> +bool range_contains_poisoned_memory(phys_addr_t start, unsigned long size)
> +{
> +	struct linux_efi_poisoned_memory *pm = efi_poisoned_memory();
> +	u64 first, last, nbits;
> +
> +	if (!pm)
> +		return false;
> +
> +	nbits = pm->size * BITS_PER_BYTE;
> +
> +	if (start + size <= pm->phys_base)
> +		return false;
> +	if (start < pm->phys_base)
> +		start = pm->phys_base;
> +
> +	first = (start - pm->phys_base) / pm->unit_size;
> +	if (first >= nbits)
> +		return false;
> +
> +	last = (start + size - 1 - pm->phys_base) / pm->unit_size;

[Severity: High]
When start is clamped to pm->phys_base earlier in this function, size is
not proportionally decreased. Does this result in an end boundary calculation
that exceeds the originally requested range?

If the allocator queries a block that starts before the EFI poisoned memory
table (start < pm->phys_base) but extends into it, the unadjusted size added
to the newly shifted start will push the last bit beyond the intended region. 
Could this out-of-bounds query cause false positive poison detections for
healthy memory that resides just after the requested block?

> +	last = min(last, nbits - 1);
> +
> +	return find_next_bit(pm->bitmap, last + 1, first) <= last;
> +}

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260909-hwpoison-kho-v4-0-359313564495@debian.org?part=4



More information about the kexec mailing list