kern/158686: [PATCH] [if_tap] Add VIMAGE support to if_tap
Daan Vreeken [PA4DAN]
pa4dan at Bliksem.VEHosting.nl
Wed Jul 6 13:10:02 UTC 2011
>Number: 158686
>Category: kern
>Synopsis: [PATCH] [if_tap] Add VIMAGE support to if_tap
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Wed Jul 06 13:10:01 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator: Daan Vreeken [PA4DAN]
>Release: FreeBSD 9.0-CURRENT amd64
>Organization:
Vitsch Electronics - http://Vitsch.nl/
>Environment:
System: FreeBSD RacebeestV3.VEHosting.LAN 9.0-CURRENT FreeBSD 9.0-CURRENT #9 r219581M: Mon Jul 4 22:10:19 CEST 2011 root at RacebeestV3.VEHosting.LAN:/usr/obj/mnt/2/sys/Multimedia amd64
>Description:
When using a kernel with 'options VIMAGE', using (and closing) a /dev/tap*
device will crash the kernel.
>How-To-Repeat:
o Create a kernel with 'options VIMAGE' and 'device tap'
o Start an application that uses /dev/tap* device(s)
o Stop the application and see the crash
>Fix:
The following patch is based on similar changes that were made to if_tun.c
and prevents the panic :
Index: sys/net/if_tap.c
===================================================================
--- sys/net/if_tap.c (revision 222928)
+++ sys/net/if_tap.c (working copy)
@@ -42,6 +42,7 @@
#include <sys/conf.h>
#include <sys/fcntl.h>
#include <sys/filio.h>
+#include <sys/jail.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
@@ -64,8 +65,9 @@
#include <net/if.h>
#include <net/if_clone.h>
#include <net/if_dl.h>
+#include <net/if_types.h>
#include <net/route.h>
-#include <net/if_types.h>
+#include <net/vnet.h>
#include <netinet/in.h>
@@ -214,6 +216,7 @@
KASSERT(!(tp->tap_flags & TAP_OPEN),
("%s flags is out of sync", ifp->if_xname));
+ CURVNET_SET(ifp->if_vnet);
knlist_destroy(&tp->tap_rsel.si_note);
destroy_dev(tp->tap_dev);
ether_ifdetach(ifp);
@@ -221,6 +224,7 @@
mtx_destroy(&tp->tap_mtx);
free(tp, M_TAP);
+ CURVNET_RESTORE();
}
static void
@@ -362,6 +366,7 @@
if (unit == -1)
append_unit = 1;
+ CURVNET_SET(CRED_TO_VNET(cred));
/* find any existing device, or allocate new unit number */
i = clone_create(&tapclones, &tap_cdevsw, &unit, dev, extra);
if (i) {
@@ -380,6 +385,7 @@
}
if_clone_create(name, namelen, NULL);
+ CURVNET_RESTORE();
} /* tapclone */
@@ -520,6 +526,7 @@
/* junk all pending output */
mtx_lock(&tp->tap_mtx);
+ CURVNET_SET(ifp->if_vnet);
IF_DRAIN(&ifp->if_snd);
/*
@@ -543,6 +550,8 @@
}
if_link_state_change(ifp, LINK_STATE_DOWN);
+ CURVNET_RESTORE();
+
funsetown(&tp->tap_sigio);
selwakeuppri(&tp->tap_rsel, PZERO+1);
KNOTE_LOCKED(&tp->tap_rsel.si_note, 0);
@@ -944,7 +953,12 @@
}
/* Pass packet up to parent. */
+ CURVNET_SET(ifp->if_vnet);
+#if __FreeBSD_version > 900038
+ M_SETFIB(m, ifp->if_fib);
+#endif
(*ifp->if_input)(ifp, m);
+ CURVNET_RESTORE();
ifp->if_ipackets ++; /* ibytes are counted in parent */
return (0);
This diff file can also be found here:
http://www.vitsch.nl/patches/
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list