From 0463fc37aae9772ac4a8ee0f8b9f2b229f76c783 Mon Sep 17 00:00:00 2001 From: Tetsuya Mukawa Date: Thu, 16 Jun 2016 11:33:11 +0900 Subject: [PATCH] pci: fix resource leak when secondary process mapping fails This patch fixes resource leak of pci_uio_map_secondary(). If pci_map_resource() succeeds but mapped address is different from an address primary process mapped, this should be error. Then the addresses secondary process mapped should be freed. Signed-off-by: Tetsuya Mukawa Acked-by: David Marchand --- lib/librte_eal/common/eal_common_pci_uio.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/librte_eal/common/eal_common_pci_uio.c b/lib/librte_eal/common/eal_common_pci_uio.c index f062e81d37..70c6155812 100644 --- a/lib/librte_eal/common/eal_common_pci_uio.c +++ b/lib/librte_eal/common/eal_common_pci_uio.c @@ -53,7 +53,7 @@ EAL_REGISTER_TAILQ(rte_uio_tailq) static int pci_uio_map_secondary(struct rte_pci_device *dev) { - int fd, i; + int fd, i, j; struct mapped_pci_resource *uio_res; struct mapped_pci_res_list *uio_res_list = RTE_TAILQ_CAST(rte_uio_tailq.head, mapped_pci_res_list); @@ -85,6 +85,16 @@ pci_uio_map_secondary(struct rte_pci_device *dev) "Cannot mmap device resource file %s to address: %p\n", uio_res->maps[i].path, uio_res->maps[i].addr); + if (mapaddr != MAP_FAILED) { + /* unmap addrs correctly mapped */ + for (j = 0; j < i; j++) + pci_unmap_resource( + uio_res->maps[j].addr, + (size_t)uio_res->maps[j].size); + /* unmap addr wrongly mapped */ + pci_unmap_resource(mapaddr, + (size_t)uio_res->maps[i].size); + } return -1; } } -- 2.20.1