aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2023-09-21 10:47:14 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2023-10-09 23:36:59 +0000
commit27f1ec0be24b45559793e486a4fa5a2e7fdadc17 (patch)
tree2a2ea253d5720824c03dfa9d9d50063ef3dd094a
parent792655abd64c94146ededd991652496ec9ec0cfe (diff)
downloadsrc-27f1ec0be24b45559793e486a4fa5a2e7fdadc17.tar.gz
src-27f1ec0be24b45559793e486a4fa5a2e7fdadc17.zip
tun/tap: correct ref count on cloned cdevs
Reported and tested by: eugen PR: 273418 Discussed with: jah, kevans Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D42008
-rw-r--r--sys/net/if_tuntap.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/net/if_tuntap.c b/sys/net/if_tuntap.c
index f4dbf685fba6..a01bc11aa64c 100644
--- a/sys/net/if_tuntap.c
+++ b/sys/net/if_tuntap.c
@@ -548,6 +548,7 @@ tun_clone_create(struct if_clone *ifc, char *name, size_t len,
if (i != 0)
i = tun_create_device(drv, unit, NULL, &dev, name);
if (i == 0) {
+ dev_ref(dev);
tuncreate(dev);
struct tuntap_softc *tp = dev->si_drv1;
*ifpp = tp->tun_ifp;
@@ -611,8 +612,10 @@ tunclone(void *arg, struct ucred *cred, char *name, int namelen,
i = tun_create_device(drv, u, cred, dev, name);
}
- if (i == 0)
+ if (i == 0) {
+ dev_ref(*dev);
if_clone_create(name, namelen, NULL);
+ }
out:
CURVNET_RESTORE();
}