Skip to content

Commit cf0816f

Browse files
Yang YingliangDamien Le Moal
Yang Yingliang
authored and
Damien Le Moal
committed
ata: libata-transport: fix error handling in ata_tlink_add()
In ata_tlink_add(), the return value of transport_add_device() is not checked. As a result, it causes null-ptr-deref while removing the module, because transport_remove_device() is called to remove the device that was not added. Unable to handle kernel NULL pointer dereference at virtual address 00000000000000d0 CPU: 33 PID: 13850 Comm: rmmod Kdump: loaded Tainted: G W 6.1.0-rc3+ #12 pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : device_del+0x48/0x39c lr : device_del+0x44/0x39c Call trace: device_del+0x48/0x39c attribute_container_class_device_del+0x28/0x40 transport_remove_classdev+0x60/0x7c attribute_container_device_trigger+0x118/0x120 transport_remove_device+0x20/0x30 ata_tlink_delete+0x88/0xb0 [libata] ata_tport_delete+0x2c/0x60 [libata] ata_port_detach+0x148/0x1b0 [libata] ata_pci_remove_one+0x50/0x80 [libata] ahci_remove_one+0x4c/0x8c [ahci] Fix this by checking and handling return value of transport_add_device() in ata_tlink_add(). Fixes: d902747 ("[libata] Add ATA transport class") Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
1 parent 3613dbe commit cf0816f

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

drivers/ata/libata-transport.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,9 @@ int ata_tlink_add(struct ata_link *link)
458458
goto tlink_err;
459459
}
460460

461-
transport_add_device(dev);
461+
error = transport_add_device(dev);
462+
if (error)
463+
goto tlink_transport_err;
462464
transport_configure_device(dev);
463465

464466
ata_for_each_dev(ata_dev, link, ALL) {
@@ -473,6 +475,7 @@ int ata_tlink_add(struct ata_link *link)
473475
ata_tdev_delete(ata_dev);
474476
}
475477
transport_remove_device(dev);
478+
tlink_transport_err:
476479
device_del(dev);
477480
tlink_err:
478481
transport_destroy_device(dev);

0 commit comments

Comments
 (0)