Alison Schofield wrote:
> KASAN reports a global-out-of-bounds access when running these nfit
> tests: clear.sh, pmem-errors.sh, pfn-meta-errors.sh, btt-errors.sh,
> daxdev-errors.sh, and inject-error.sh.
> 
> [] BUG: KASAN: global-out-of-bounds in nfit_test_ctl+0x769f/0x7840 [nfit_test]
> [] Read of size 4 at addr ffffffffc03ea01c by task ndctl/1215
> [] The buggy address belongs to the variable:
> [] handle+0x1c/0x1df4 [nfit_test]
> 
> nfit_test_search_spa() uses handle[nvdimm->id] to retrieve a device
> handle and triggers a KASAN error when it reads past the end of the
> handle array. It should not be indexing the handle array at all.
> 
> The correct device handle is stored in per-DIMM test data. Each DIMM
> has a struct nfit_mem that embeds a struct acpi_nfit_memdev that
> describes the NFIT device handle. Use that device handle here. 
> 
> Fixes: 10246dc84dfc ("acpi nfit: nfit_test supports translate SPA")
> Cc: <[email protected]>
> Signed-off-by: Alison Schofield <[email protected]>

Picked up
https://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm.git/commit/?h=libnvdimm-for-next

Thanks,
Ira

> ---
> 
> Changes in v2:
> - Use the correct handle in per-DIMM test data (Dan)
> - Update commit message and log
> - Update Fixes Tag
> 
> 
>  tools/testing/nvdimm/test/nfit.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/testing/nvdimm/test/nfit.c 
> b/tools/testing/nvdimm/test/nfit.c
> index cfd4378e2129..f87e9f251d13 100644
> --- a/tools/testing/nvdimm/test/nfit.c
> +++ b/tools/testing/nvdimm/test/nfit.c
> @@ -670,6 +670,7 @@ static int nfit_test_search_spa(struct nvdimm_bus *bus,
>               .addr = spa->spa,
>               .region = NULL,
>       };
> +     struct nfit_mem *nfit_mem;
>       u64 dpa;
>  
>       ret = device_for_each_child(&bus->dev, &ctx,
> @@ -687,8 +688,12 @@ static int nfit_test_search_spa(struct nvdimm_bus *bus,
>        */
>       nd_mapping = &nd_region->mapping[nd_region->ndr_mappings - 1];
>       nvdimm = nd_mapping->nvdimm;
> +     nfit_mem = nvdimm_provider_data(nvdimm);
> +     if (!nfit_mem)
> +             return -EINVAL;
>  
> -     spa->devices[0].nfit_device_handle = handle[nvdimm->id];
> +     spa->devices[0].nfit_device_handle =
> +             __to_nfit_memdev(nfit_mem)->device_handle;
>       spa->num_nvdimms = 1;
>       spa->devices[0].dpa = dpa;
>  
> 
> base-commit: 211ddde0823f1442e4ad052a2f30f050145ccada
> -- 
> 2.37.3
> 



Reply via email to