mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
ipack: tpci200: fix memory leak in the tpci200_register
The error handling code in tpci200_register does not free interface_regs
allocated by ioremap and the current version of error handling code is
problematic.
Fix this by refactoring the error handling code and free interface_regs
when necessary.
Fixes: 43986798fd
("ipack: add error handling for ioremap_nocache")
Cc: stable@vger.kernel.org
Reported-by: Dongliang Mu <mudongliangabcd@gmail.com>
Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
Link: https://lore.kernel.org/r/20210810100323.3938492-2-mudongliangabcd@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
57a1681095
commit
50f05bd114
@ -254,7 +254,7 @@ static int tpci200_register(struct tpci200_board *tpci200)
|
||||
"(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 2 !",
|
||||
tpci200->info->pdev->bus->number,
|
||||
tpci200->info->pdev->devfn);
|
||||
goto out_disable_pci;
|
||||
goto err_disable_device;
|
||||
}
|
||||
|
||||
/* Request IO ID INT space (Bar 3) */
|
||||
@ -266,7 +266,7 @@ static int tpci200_register(struct tpci200_board *tpci200)
|
||||
"(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 3 !",
|
||||
tpci200->info->pdev->bus->number,
|
||||
tpci200->info->pdev->devfn);
|
||||
goto out_release_ip_space;
|
||||
goto err_ip_interface_bar;
|
||||
}
|
||||
|
||||
/* Request MEM8 space (Bar 5) */
|
||||
@ -277,7 +277,7 @@ static int tpci200_register(struct tpci200_board *tpci200)
|
||||
"(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 5!",
|
||||
tpci200->info->pdev->bus->number,
|
||||
tpci200->info->pdev->devfn);
|
||||
goto out_release_ioid_int_space;
|
||||
goto err_io_id_int_spaces_bar;
|
||||
}
|
||||
|
||||
/* Request MEM16 space (Bar 4) */
|
||||
@ -288,7 +288,7 @@ static int tpci200_register(struct tpci200_board *tpci200)
|
||||
"(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 4!",
|
||||
tpci200->info->pdev->bus->number,
|
||||
tpci200->info->pdev->devfn);
|
||||
goto out_release_mem8_space;
|
||||
goto err_mem8_space_bar;
|
||||
}
|
||||
|
||||
/* Map internal tpci200 driver user space */
|
||||
@ -302,7 +302,7 @@ static int tpci200_register(struct tpci200_board *tpci200)
|
||||
tpci200->info->pdev->bus->number,
|
||||
tpci200->info->pdev->devfn);
|
||||
res = -ENOMEM;
|
||||
goto out_release_mem8_space;
|
||||
goto err_mem16_space_bar;
|
||||
}
|
||||
|
||||
/* Initialize lock that protects interface_regs */
|
||||
@ -341,18 +341,22 @@ static int tpci200_register(struct tpci200_board *tpci200)
|
||||
"(bn 0x%X, sn 0x%X) unable to register IRQ !",
|
||||
tpci200->info->pdev->bus->number,
|
||||
tpci200->info->pdev->devfn);
|
||||
goto out_release_ioid_int_space;
|
||||
goto err_interface_regs;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
out_release_mem8_space:
|
||||
err_interface_regs:
|
||||
pci_iounmap(tpci200->info->pdev, tpci200->info->interface_regs);
|
||||
err_mem16_space_bar:
|
||||
pci_release_region(tpci200->info->pdev, TPCI200_MEM16_SPACE_BAR);
|
||||
err_mem8_space_bar:
|
||||
pci_release_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR);
|
||||
out_release_ioid_int_space:
|
||||
err_io_id_int_spaces_bar:
|
||||
pci_release_region(tpci200->info->pdev, TPCI200_IO_ID_INT_SPACES_BAR);
|
||||
out_release_ip_space:
|
||||
err_ip_interface_bar:
|
||||
pci_release_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR);
|
||||
out_disable_pci:
|
||||
err_disable_device:
|
||||
pci_disable_device(tpci200->info->pdev);
|
||||
return res;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user