Skip to content

Commit

Permalink
net/tap: fix fd leak on creation failure
Browse files Browse the repository at this point in the history
[ upstream commit cbf8909 ]

When eth_dev_tap_create() is failed, nlsk_fd and ka_fd won't be closed
thus leading fds leak. Zero is a valid fd. Ultimately leads to a valid
fd was closed by mistake.

Fixes: bf7b7f4 ("net/tap: create netdevice during probing")
Fixes: cb7e68d ("net/tap: fix cleanup on allocation failure")

Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
  • Loading branch information
wyjwang authored and kevintraynor committed May 27, 2020
1 parent 15b5f47 commit 78d8e91
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions drivers/net/tap/rte_eth_tap.c
Expand Up @@ -1740,6 +1740,8 @@ eth_dev_tap_create(struct rte_vdev_device *vdev, char *tap_name,
pmd->dev = dev;
snprintf(pmd->name, sizeof(pmd->name), "%s", tap_name);
pmd->type = type;
pmd->ka_fd = -1;
pmd->nlsk_fd = -1;

pmd->ioctl_sock = socket(AF_INET, SOCK_DGRAM, 0);
if (pmd->ioctl_sock == -1) {
Expand Down Expand Up @@ -1770,7 +1772,6 @@ eth_dev_tap_create(struct rte_vdev_device *vdev, char *tap_name,
dev->intr_handle = &pmd->intr_handle;

/* Presetup the fds to -1 as being not valid */
pmd->ka_fd = -1;
for (i = 0; i < RTE_PMD_TAP_MAX_QUEUES; i++) {
process_private->rxq_fds[i] = -1;
process_private->txq_fds[i] = -1;
Expand Down Expand Up @@ -1911,7 +1912,11 @@ eth_dev_tap_create(struct rte_vdev_device *vdev, char *tap_name,
tap_flow_implicit_flush(pmd, NULL);

error_exit:
if (pmd->ioctl_sock > 0)
if (pmd->nlsk_fd != -1)
close(pmd->nlsk_fd);
if (pmd->ka_fd != -1)
close(pmd->ka_fd);
if (pmd->ioctl_sock != -1)
close(pmd->ioctl_sock);
/* mac_addrs must not be freed alone because part of dev_private */
dev->data->mac_addrs = NULL;
Expand Down

0 comments on commit 78d8e91

Please sign in to comment.