linux-stable/drivers/ata
John Garry 7371ef43c7 libata: Remove extra scsi_host_put() in ata_scsi_add_hosts()
[ Upstream commit 1d72f7aec3 ]

If the call to scsi_add_host_with_dma() in ata_scsi_add_hosts() fails,
then we may get use-after-free KASAN warns:

==================================================================
BUG: KASAN: use-after-free in kobject_put+0x24/0x180
Read of size 1 at addr ffff0026b8c80364 by task swapper/0/1
CPU: 1 PID: 1 Comm: swapper/0 Tainted: G        W         5.6.0-rc3-00004-g5a71b206ea82-dirty #1765
Hardware name: Huawei TaiShan 200 (Model 2280)/BC82AMDD, BIOS 2280-V2 CS V3.B160.01 02/24/2020
Call trace:
dump_backtrace+0x0/0x298
show_stack+0x14/0x20
dump_stack+0x118/0x190
print_address_description.isra.9+0x6c/0x3b8
__kasan_report+0x134/0x23c
kasan_report+0xc/0x18
__asan_load1+0x5c/0x68
kobject_put+0x24/0x180
put_device+0x10/0x20
scsi_host_put+0x10/0x18
ata_devres_release+0x74/0xb0
release_nodes+0x2d0/0x470
devres_release_all+0x50/0x78
really_probe+0x2d4/0x560
driver_probe_device+0x7c/0x148
device_driver_attach+0x94/0xa0
__driver_attach+0xa8/0x110
bus_for_each_dev+0xe8/0x158
driver_attach+0x30/0x40
bus_add_driver+0x220/0x2e0
driver_register+0xbc/0x1d0
__pci_register_driver+0xbc/0xd0
ahci_pci_driver_init+0x20/0x28
do_one_initcall+0xf0/0x608
kernel_init_freeable+0x31c/0x384
kernel_init+0x10/0x118
ret_from_fork+0x10/0x18

Allocated by task 5:
save_stack+0x28/0xc8
__kasan_kmalloc.isra.8+0xbc/0xd8
kasan_kmalloc+0xc/0x18
__kmalloc+0x1a8/0x280
scsi_host_alloc+0x44/0x678
ata_scsi_add_hosts+0x74/0x268
ata_host_register+0x228/0x488
ahci_host_activate+0x1c4/0x2a8
ahci_init_one+0xd18/0x1298
local_pci_probe+0x74/0xf0
work_for_cpu_fn+0x2c/0x48
process_one_work+0x488/0xc08
worker_thread+0x330/0x5d0
kthread+0x1c8/0x1d0
ret_from_fork+0x10/0x18

Freed by task 5:
save_stack+0x28/0xc8
__kasan_slab_free+0x118/0x180
kasan_slab_free+0x10/0x18
slab_free_freelist_hook+0xa4/0x1a0
kfree+0xd4/0x3a0
scsi_host_dev_release+0x100/0x148
device_release+0x7c/0xe0
kobject_put+0xb0/0x180
put_device+0x10/0x20
scsi_host_put+0x10/0x18
ata_scsi_add_hosts+0x210/0x268
ata_host_register+0x228/0x488
ahci_host_activate+0x1c4/0x2a8
ahci_init_one+0xd18/0x1298
local_pci_probe+0x74/0xf0
work_for_cpu_fn+0x2c/0x48
process_one_work+0x488/0xc08
worker_thread+0x330/0x5d0
kthread+0x1c8/0x1d0
ret_from_fork+0x10/0x18

There is also refcount issue, as well:
WARNING: CPU: 1 PID: 1 at lib/refcount.c:28 refcount_warn_saturate+0xf8/0x170

The issue is that we make an erroneous extra call to scsi_host_put()
for that host:

So in ahci_init_one()->ata_host_alloc_pinfo()->ata_host_alloc(), we setup
a device release method - ata_devres_release() - which intends to release
the SCSI hosts:

static void ata_devres_release(struct device *gendev, void *res)
{
	...
	for (i = 0; i < host->n_ports; i++) {
		struct ata_port *ap = host->ports[i];

		if (!ap)
			continue;

		if (ap->scsi_host)
			scsi_host_put(ap->scsi_host);

	}
	...
}

However in the ata_scsi_add_hosts() error path, we also call
scsi_host_put() for the SCSI hosts.

Fix by removing the the scsi_host_put() calls in ata_scsi_add_hosts() and
leave this to ata_devres_release().

Fixes: f31871951b ("libata: separate out ata_host_alloc() and ata_host_register()")
Signed-off-by: John Garry <john.garry@huawei.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2020-04-17 10:48:40 +02:00
..
acard-ahci.c libata: convert core and drivers to ->hw_tag usage 2018-05-11 13:10:43 -07:00
ahci.c ahci: Add Intel Comet Lake H RAID PCI ID 2020-04-02 15:28:21 +02:00
ahci.h libata/ahci: Drop PCS quirk for Denverton and beyond 2019-10-05 13:09:52 +02:00
ahci_brcm.c ata: ahci_brcm: BCM7425 AHCI requires AHCI_HFLAG_DELAY_ENGINE 2020-01-09 10:19:01 +01:00
ahci_ceva.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_da850.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_dm816.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_imx.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_mtk.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_mvebu.c ata: ahci: mvebu: do Armada 38x configuration only on relevant SoCs 2019-12-05 09:21:06 +01:00
ahci_octeon.c
ahci_platform.c ata: Disable AHCI ALPM feature for Ampere Computing eMAG SATA 2019-11-20 18:46:06 +01:00
ahci_qoriq.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_seattle.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_st.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_sunxi.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_tegra.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ahci_xgene.c ata: add an extra argument to ahci_platform_get_resources() 2018-08-22 08:08:27 -07:00
ata_generic.c
ata_piix.c ata_piix: constify pci_bits 2018-01-08 06:15:41 -08:00
Kconfig ata: ahci_brcm: Allow using driver or DSL SoCs 2019-11-24 08:19:33 +01:00
libahci.c ahci: Do not export local variable ahci_em_messages 2020-01-27 14:51:07 +01:00
libahci_platform.c ata: libahci_platform: Export again ahci_platform_<en/dis>able_phys() 2020-01-09 10:19:01 +01:00
libata-acpi.c
libata-core.c ata: ahci: Add shutdown to freeze hardware resources of ahci 2020-02-28 16:39:00 +01:00
libata-eh.c libata: don't request sense data on !ZAC ATA devices 2019-07-26 09:14:12 +02:00
libata-pmp.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
libata-scsi.c libata: Remove extra scsi_host_put() in ata_scsi_add_hosts() 2020-04-17 10:48:40 +02:00
libata-sff.c libata: add SG safety checks in SFF pio transfers 2019-08-29 08:28:45 +02:00
libata-trace.c
libata-transport.c libata: add refcounting to ata_host 2018-03-13 13:29:10 -07:00
libata-transport.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
libata-zpodd.c libata: zpodd: Fix small read overflow in zpodd_get_mech_type() 2019-08-25 10:47:54 +02:00
libata.h scsi: libsas: dynamically allocate and free ata host 2018-06-19 22:02:25 -04:00
Makefile Merge branch 'for-4.17' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata 2018-04-03 17:42:25 -07:00
pata_acpi.c
pata_ali.c ata: Deprecate pci_get_bus_and_slot() 2018-01-11 17:23:23 -06:00
pata_amd.c cs5536: add support for IDE controller variant 2017-08-11 10:35:07 -07:00
pata_arasan_cf.c pata_arasan_cf: Delete an unnecessary variable initialisation in arasan_cf_probe() 2018-02-18 05:16:35 -08:00
pata_artop.c ata: pata_artop: remove redundant initialization of pio 2017-09-18 20:24:21 -07:00
pata_atiixp.c libata:pata_atiixp: Don't use unconnected secondary port on SB600 2018-01-08 04:02:02 -08:00
pata_atp867x.c ata: mark expected switch fall-throughs 2017-10-23 07:06:09 -07:00
pata_bk3710.c pata_bk3710: clarify license version and use SPDX header 2018-03-01 13:59:03 -08:00
pata_cmd64x.c
pata_cmd640.c libata: remove ata_sff_data_xfer_noirq() 2018-07-11 10:45:28 -07:00
pata_cs5520.c
pata_cs5530.c
pata_cs5535.c
pata_cs5536.c cs5536: add support for IDE controller variant 2017-08-11 10:35:07 -07:00
pata_cypress.c
pata_efar.c
pata_ep93xx.c ata: ep93xx: Use proper enums for directions 2019-11-24 08:20:10 +01:00
pata_falcon.c pata_falcon: clarify license version and use SPDX header 2018-03-01 13:58:17 -08:00
pata_ftide010.c ata: ftide010: Add a quirk for SQ201 2018-08-27 14:25:54 -06:00
pata_gayle.c ata: add Amiga Gayle PATA controller driver 2018-03-19 07:41:36 -07:00
pata_hpt3x2n.c
pata_hpt3x3.c
pata_hpt37x.c ata: hpt37x: Convert to use match_string() helper 2018-05-07 08:50:30 -07:00
pata_hpt366.c
pata_icside.c libata: remove ata_sff_data_xfer_noirq() 2018-07-11 10:45:28 -07:00
pata_imx.c Merge branch 'for-4.19' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata 2018-08-24 13:20:33 -07:00
pata_isapnp.c
pata_it821x.c pata_it821x: Delete an error message for a failed memory allocation in it821x_firmware_command() 2018-02-18 05:26:07 -08:00
pata_it8213.c
pata_ixp4xx_cf.c
pata_jmicron.c
pata_legacy.c libata: remove ata_sff_data_xfer_noirq() 2018-07-11 10:45:28 -07:00
pata_macio.c pata_macio: Delete an error message for a failed memory allocation in two functions 2018-02-18 05:24:16 -08:00
pata_marvell.c
pata_mpc52xx.c pata_mpc52xx: Delete an error message for a failed memory allocation in mpc52xx_ata_probe() 2018-02-18 05:23:25 -08:00
pata_mpiix.c
pata_netcell.c
pata_ninja32.c
pata_ns87410.c
pata_ns87415.c
pata_octeon_cf.c pata_octeon_cf: use of_property_read_{bool|u32}() 2017-08-28 10:44:24 -07:00
pata_of_platform.c
pata_oldpiix.c
pata_opti.c
pata_optidma.c
pata_palmld.c libata: remove ata_sff_data_xfer_noirq() 2018-07-11 10:45:28 -07:00
pata_pcmcia.c libata: remove ata_sff_data_xfer_noirq() 2018-07-11 10:45:28 -07:00
pata_pdc202xx_old.c
pata_pdc2027x.c ata: pata_pdc2027x: Replace mdelay with msleep 2018-01-25 07:28:31 -08:00
pata_piccolo.c
pata_platform.c libata: remove ata_sff_data_xfer_noirq() 2018-07-11 10:45:28 -07:00
pata_pxa.c ata: pata_pxa: remove the dmaengine compat need 2018-06-18 21:32:07 +02:00
pata_radisys.c
pata_rb532_cf.c ata: rb532_cf: cut drvdata assignment 2017-05-30 11:54:37 -04:00
pata_rdc.c ata: declare ata_port_info structures as const 2017-06-12 14:06:34 -04:00
pata_rz1000.c
pata_samsung_cf.c headers: separate linux/mod_devicetable.h from linux/platform_device.h 2018-07-07 17:52:26 +02:00
pata_sc1200.c
pata_sch.c ata: declare ata_port_info structures as const 2017-06-12 14:06:34 -04:00
pata_serverworks.c
pata_sil680.c
pata_sis.c
pata_sl82c105.c
pata_triflex.c
pata_via.c libata: remove ata_sff_data_xfer_noirq() 2018-07-11 10:45:28 -07:00
pdc_adma.c ata: update references for libata documentation 2017-05-16 11:25:59 -04:00
sata_dwc_460ex.c libata: convert core and drivers to ->hw_tag usage 2018-05-11 13:10:43 -07:00
sata_fsl.c libata: Fix retrieving of active qcs 2020-01-09 10:19:01 +01:00
sata_gemini.c ata: sata_gemini: Introduce explicit IDE pin control 2017-08-11 10:32:09 -07:00
sata_gemini.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sata_highbank.c libahci: Allow drivers to override stop_engine 2018-04-26 11:25:04 -07:00
sata_inic162x.c ata: declare ata_port_info structures as const 2017-06-12 14:06:34 -04:00
sata_mv.c libata: Fix retrieving of active qcs 2020-01-09 10:19:01 +01:00
sata_nv.c libata: Fix retrieving of active qcs 2020-01-09 10:19:01 +01:00
sata_promise.c ata: update references for libata documentation 2017-05-16 11:25:59 -04:00
sata_promise.h ata: update references for libata documentation 2017-05-16 11:25:59 -04:00
sata_qstor.c ata: update references for libata documentation 2017-05-16 11:25:59 -04:00
sata_rcar.c sata_rcar: fix deferred probing 2019-02-12 19:47:08 +01:00
sata_sil.c ata: update references for libata documentation 2017-05-16 11:25:59 -04:00
sata_sil24.c Merge branch 'for-4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata 2018-06-05 17:01:41 -07:00
sata_sis.c ata: update references for libata documentation 2017-05-16 11:25:59 -04:00
sata_svw.c ata: Convert to using %pOF instead of full_name 2017-07-18 18:02:36 -04:00
sata_sx4.c ata: update references for libata documentation 2017-05-16 11:25:59 -04:00
sata_uli.c ata: update references for libata documentation 2017-05-16 11:25:59 -04:00
sata_via.c sata_via: Enable optional hotplug on VT6420 2017-06-26 16:54:53 -04:00
sata_vsc.c ata: update references for libata documentation 2017-05-16 11:25:59 -04:00
sis.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00