diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2023-09-21 10:47:14 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2023-10-09 23:36:59 +0000 |
commit | 27f1ec0be24b45559793e486a4fa5a2e7fdadc17 (patch) | |
tree | 2a2ea253d5720824c03dfa9d9d50063ef3dd094a | |
parent | 792655abd64c94146ededd991652496ec9ec0cfe (diff) | |
download | src-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.c | 5 |
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(); } |