Commit 50f05bd1 authored by Dongliang Mu's avatar Dongliang Mu Committed by Greg Kroah-Hartman

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: 43986798 ("ipack: add error handling for ioremap_nocache")
Cc: stable@vger.kernel.org
Reported-by: default avatarDongliang Mu <mudongliangabcd@gmail.com>
Signed-off-by: default avatarDongliang Mu <mudongliangabcd@gmail.com>
Link: https://lore.kernel.org/r/20210810100323.3938492-2-mudongliangabcd@gmail.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 57a16810
...@@ -254,7 +254,7 @@ static int tpci200_register(struct tpci200_board *tpci200) ...@@ -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 !", "(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 2 !",
tpci200->info->pdev->bus->number, tpci200->info->pdev->bus->number,
tpci200->info->pdev->devfn); tpci200->info->pdev->devfn);
goto out_disable_pci; goto err_disable_device;
} }
/* Request IO ID INT space (Bar 3) */ /* Request IO ID INT space (Bar 3) */
...@@ -266,7 +266,7 @@ static int tpci200_register(struct tpci200_board *tpci200) ...@@ -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 !", "(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 3 !",
tpci200->info->pdev->bus->number, tpci200->info->pdev->bus->number,
tpci200->info->pdev->devfn); tpci200->info->pdev->devfn);
goto out_release_ip_space; goto err_ip_interface_bar;
} }
/* Request MEM8 space (Bar 5) */ /* Request MEM8 space (Bar 5) */
...@@ -277,7 +277,7 @@ static int tpci200_register(struct tpci200_board *tpci200) ...@@ -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!", "(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 5!",
tpci200->info->pdev->bus->number, tpci200->info->pdev->bus->number,
tpci200->info->pdev->devfn); tpci200->info->pdev->devfn);
goto out_release_ioid_int_space; goto err_io_id_int_spaces_bar;
} }
/* Request MEM16 space (Bar 4) */ /* Request MEM16 space (Bar 4) */
...@@ -288,7 +288,7 @@ static int tpci200_register(struct tpci200_board *tpci200) ...@@ -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!", "(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 4!",
tpci200->info->pdev->bus->number, tpci200->info->pdev->bus->number,
tpci200->info->pdev->devfn); tpci200->info->pdev->devfn);
goto out_release_mem8_space; goto err_mem8_space_bar;
} }
/* Map internal tpci200 driver user space */ /* Map internal tpci200 driver user space */
...@@ -302,7 +302,7 @@ static int tpci200_register(struct tpci200_board *tpci200) ...@@ -302,7 +302,7 @@ static int tpci200_register(struct tpci200_board *tpci200)
tpci200->info->pdev->bus->number, tpci200->info->pdev->bus->number,
tpci200->info->pdev->devfn); tpci200->info->pdev->devfn);
res = -ENOMEM; res = -ENOMEM;
goto out_release_mem8_space; goto err_mem16_space_bar;
} }
/* Initialize lock that protects interface_regs */ /* Initialize lock that protects interface_regs */
...@@ -341,18 +341,22 @@ static int tpci200_register(struct tpci200_board *tpci200) ...@@ -341,18 +341,22 @@ static int tpci200_register(struct tpci200_board *tpci200)
"(bn 0x%X, sn 0x%X) unable to register IRQ !", "(bn 0x%X, sn 0x%X) unable to register IRQ !",
tpci200->info->pdev->bus->number, tpci200->info->pdev->bus->number,
tpci200->info->pdev->devfn); tpci200->info->pdev->devfn);
goto out_release_ioid_int_space; goto err_interface_regs;
} }
return 0; 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); 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); 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); pci_release_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR);
out_disable_pci: err_disable_device:
pci_disable_device(tpci200->info->pdev); pci_disable_device(tpci200->info->pdev);
return res; return res;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment