Skip to content

Commit e471486

Browse files
committed
acpi, nfit: fix acpi_nfit_flush_probe() crash
We queue an on-stack work item to 'nfit_wq' and wait for it to complete as part of a 'flush_probe' request. However, if the user cancels the wait we need to make sure the item is flushed from the queue otherwise we are leaving an out-of-scope stack address on the work list. BUG: unable to handle kernel paging request at ffffbcb3c72f7cd0 IP: [<ffffffffa9413a7b>] __list_add+0x1b/0xb0 [..] RIP: 0010:[<ffffffffa9413a7b>] [<ffffffffa9413a7b>] __list_add+0x1b/0xb0 RSP: 0018:ffffbcb3c7ba7c00 EFLAGS: 00010046 [..] Call Trace: [<ffffffffa90bb11a>] insert_work+0x3a/0xc0 [<ffffffffa927fdda>] ? seq_open+0x5a/0xa0 [<ffffffffa90bb30a>] __queue_work+0x16a/0x460 [<ffffffffa90bbb08>] queue_work_on+0x38/0x40 [<ffffffffc0cf2685>] acpi_nfit_flush_probe+0x95/0xc0 [nfit] [<ffffffffc0cf25d0>] ? nfit_visible+0x40/0x40 [nfit] [<ffffffffa9571495>] wait_probe_show+0x25/0x60 [<ffffffffa9546b30>] dev_attr_show+0x20/0x50 Fixes: 7ae0fa4 ("nfit, libnvdimm: async region scrub workqueue") Cc: <[email protected]> Reviewed-by: Vishal Verma <[email protected]> Signed-off-by: Dan Williams <[email protected]>
1 parent 9d032f4 commit e471486

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

drivers/acpi/nfit/core.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2704,6 +2704,7 @@ static int acpi_nfit_flush_probe(struct nvdimm_bus_descriptor *nd_desc)
27042704
struct acpi_nfit_desc *acpi_desc = to_acpi_nfit_desc(nd_desc);
27052705
struct device *dev = acpi_desc->dev;
27062706
struct acpi_nfit_flush_work flush;
2707+
int rc;
27072708

27082709
/* bounce the device lock to flush acpi_nfit_add / acpi_nfit_notify */
27092710
device_lock(dev);
@@ -2716,7 +2717,10 @@ static int acpi_nfit_flush_probe(struct nvdimm_bus_descriptor *nd_desc)
27162717
INIT_WORK_ONSTACK(&flush.work, flush_probe);
27172718
COMPLETION_INITIALIZER_ONSTACK(flush.cmp);
27182719
queue_work(nfit_wq, &flush.work);
2719-
return wait_for_completion_interruptible(&flush.cmp);
2720+
2721+
rc = wait_for_completion_interruptible(&flush.cmp);
2722+
cancel_work_sync(&flush.work);
2723+
return rc;
27202724
}
27212725

27222726
static int acpi_nfit_clear_to_send(struct nvdimm_bus_descriptor *nd_desc,

0 commit comments

Comments
 (0)