lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 523/717] media: netup_unidvb: Dont leak SPI master in probe error path
    Date
    From: Lukas Wunner <lukas@wunner.de>

    commit e297ddf296de35037fa97f4302782def196d350a upstream.

    If the call to spi_register_master() fails on probe of the NetUP
    Universal DVB driver, the spi_master struct is erroneously not freed.

    Likewise, if spi_new_device() fails, the spi_controller struct is
    not unregistered. Plug the leaks.

    While at it, fix an ordering issue in netup_spi_release() wherein
    spi_unregister_master() is called after fiddling with the IRQ control
    register. The correct order is to call spi_unregister_master() *before*
    this teardown step because bus accesses may still be ongoing until that
    function returns.

    Fixes: 52b1eaf4c59a ("[media] netup_unidvb: NetUP Universal DVB-S/S2/T/T2/C PCI-E card driver")
    Signed-off-by: Lukas Wunner <lukas@wunner.de>
    Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Cc: <stable@vger.kernel.org> # v4.3+: 5e844cc37a5c: spi: Introduce device-managed SPI controller allocation
    Cc: <stable@vger.kernel.org> # v4.3+
    Cc: Kozlov Sergey <serjk@netup.ru>
    Link: https://lore.kernel.org/r/c4c24f333fc7840f4a3db24789e6e10dd660bede.1607286887.git.lukas@wunner.de
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/media/pci/netup_unidvb/netup_unidvb_spi.c | 5 +++--
    1 file changed, 3 insertions(+), 2 deletions(-)

    --- a/drivers/media/pci/netup_unidvb/netup_unidvb_spi.c
    +++ b/drivers/media/pci/netup_unidvb/netup_unidvb_spi.c
    @@ -175,7 +175,7 @@ int netup_spi_init(struct netup_unidvb_d
    struct spi_master *master;
    struct netup_spi *nspi;

    - master = spi_alloc_master(&ndev->pci_dev->dev,
    + master = devm_spi_alloc_master(&ndev->pci_dev->dev,
    sizeof(struct netup_spi));
    if (!master) {
    dev_err(&ndev->pci_dev->dev,
    @@ -208,6 +208,7 @@ int netup_spi_init(struct netup_unidvb_d
    ndev->pci_slot,
    ndev->pci_func);
    if (!spi_new_device(master, &netup_spi_board)) {
    + spi_unregister_master(master);
    ndev->spi = NULL;
    dev_err(&ndev->pci_dev->dev,
    "%s(): unable to create SPI device\n", __func__);
    @@ -226,13 +227,13 @@ void netup_spi_release(struct netup_unid
    if (!spi)
    return;

    + spi_unregister_master(spi->master);
    spin_lock_irqsave(&spi->lock, flags);
    reg = readw(&spi->regs->control_stat);
    writew(reg | NETUP_SPI_CTRL_IRQ, &spi->regs->control_stat);
    reg = readw(&spi->regs->control_stat);
    writew(reg & ~NETUP_SPI_CTRL_IMASK, &spi->regs->control_stat);
    spin_unlock_irqrestore(&spi->lock, flags);
    - spi_unregister_master(spi->master);
    ndev->spi = NULL;
    }


    \
     
     \ /
      Last update: 2020-12-28 15:47    [W:7.640 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site