]> git.droids-corp.org - dpdk.git/commitdiff
net/pcap: fix resource leakage on port probe
authorQiming Chen <chenqiming_huawei@163.com>
Mon, 30 Aug 2021 03:01:08 +0000 (11:01 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Thu, 9 Sep 2021 13:01:47 +0000 (15:01 +0200)
When the port is probed, if the eth_from_pcaps function fails, the
previously opened pcap resources are not released, causing resource
leakage.

The patch solves the problem of resource leakage caused by abnormal
branch exit during the port probe process.

Fixes: 4c173302c307 ("pcap: add new driver")
Cc: stable@dpdk.org
Signed-off-by: Qiming Chen <chenqiming_huawei@163.com>
Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>
drivers/net/pcap/pcap_ethdev.c

index a8774b7a432a79ffc693d76175f7d15877a2fb1b..5c4cdbf8739551550ef7825e2b123310c4201fac 100644 (file)
@@ -1362,6 +1362,33 @@ eth_from_pcaps(struct rte_vdev_device *vdev,
        return 0;
 }
 
+static void
+eth_release_pcaps(struct pmd_devargs *pcaps,
+               struct pmd_devargs *dumpers,
+               int single_iface)
+{
+       unsigned int i;
+
+       if (single_iface) {
+               if (pcaps->queue[0].pcap)
+                       pcap_close(pcaps->queue[0].pcap);
+               return;
+       }
+
+       for (i = 0; i < dumpers->num_of_queue; i++) {
+               if (dumpers->queue[i].dumper)
+                       pcap_dump_close(dumpers->queue[i].dumper);
+
+               if (dumpers->queue[i].pcap)
+                       pcap_close(dumpers->queue[i].pcap);
+       }
+
+       for (i = 0; i < pcaps->num_of_queue; i++) {
+               if (pcaps->queue[i].pcap)
+                       pcap_close(pcaps->queue[i].pcap);
+       }
+}
+
 static int
 pmd_pcap_probe(struct rte_vdev_device *dev)
 {
@@ -1582,6 +1609,9 @@ create_eth:
 free_kvlist:
        rte_kvargs_free(kvlist);
 
+       if (ret < 0)
+               eth_release_pcaps(&pcaps, &dumpers, devargs_all.single_iface);
+
        return ret;
 }