Module Name:    src
Committed By:   ozaki-r
Date:           Fri Nov  7 09:26:08 UTC 2014

Modified Files:
        src/sys/net: if_tap.c

Log Message:
Complete the initialization of tap_softc before if_attach

Basically we should complete the initializaiton of softc before if_attach
because once if_attach is called if_detach can be called for the softc
before returning from if_attach. In case of tap, mutex_destroy can be
called before mutex_init that comes after if_attach.


To generate a diff of this commit:
cvs rdiff -u -r1.79 -r1.80 src/sys/net/if_tap.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if_tap.c
diff -u src/sys/net/if_tap.c:1.79 src/sys/net/if_tap.c:1.80
--- src/sys/net/if_tap.c:1.79	Fri Oct  3 06:46:02 2014
+++ src/sys/net/if_tap.c	Fri Nov  7 09:26:08 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_tap.c,v 1.79 2014/10/03 06:46:02 skrll Exp $	*/
+/*	$NetBSD: if_tap.c,v 1.80 2014/11/07 09:26:08 ozaki-r Exp $	*/
 
 /*
  *  Copyright (c) 2003, 2004, 2008, 2009 The NetBSD Foundation.
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.79 2014/10/03 06:46:02 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.80 2014/11/07 09:26:08 ozaki-r Exp $");
 
 #if defined(_KERNEL_OPT)
 
@@ -275,6 +275,25 @@ tap_attach(device_t parent, device_t sel
 	sc->sc_sih = NULL;
 	getnanotime(&sc->sc_btime);
 	sc->sc_atime = sc->sc_mtime = sc->sc_btime;
+	sc->sc_flags = 0;
+	selinit(&sc->sc_rsel);
+
+	/*
+	 * Initialize the two locks for the device.
+	 *
+	 * We need a lock here because even though the tap device can be
+	 * opened only once, the file descriptor might be passed to another
+	 * process, say a fork(2)ed child.
+	 *
+	 * The Giant saves us from most of the hassle, but since the read
+	 * operation can sleep, we don't want two processes to wake up at
+	 * the same moment and both try and dequeue a single packet.
+	 *
+	 * The queue for event listeners (used by kqueue(9), see below) has
+	 * to be protected too, so use a spin lock.
+	 */
+	mutex_init(&sc->sc_rdlock, MUTEX_DEFAULT, IPL_NONE);
+	mutex_init(&sc->sc_kqlock, MUTEX_DEFAULT, IPL_VM);
 
 	if (!pmf_device_register(self, NULL, NULL))
 		aprint_error_dev(self, "couldn't establish power handler\n");
@@ -327,8 +346,6 @@ tap_attach(device_t parent, device_t sel
 	if_attach(ifp);
 	ether_ifattach(ifp, enaddr);
 
-	sc->sc_flags = 0;
-
 #if defined(COMPAT_40) || defined(MODULAR)
 	/*
 	 * Add a sysctl node for that interface.
@@ -353,25 +370,6 @@ tap_attach(device_t parent, device_t sel
 		aprint_error_dev(self, "sysctl_createv returned %d, ignoring\n",
 		    error);
 #endif
-
-	/*
-	 * Initialize the two locks for the device.
-	 *
-	 * We need a lock here because even though the tap device can be
-	 * opened only once, the file descriptor might be passed to another
-	 * process, say a fork(2)ed child.
-	 *
-	 * The Giant saves us from most of the hassle, but since the read
-	 * operation can sleep, we don't want two processes to wake up at
-	 * the same moment and both try and dequeue a single packet.
-	 *
-	 * The queue for event listeners (used by kqueue(9), see below) has
-	 * to be protected too, so use a spin lock.
-	 */
-	mutex_init(&sc->sc_rdlock, MUTEX_DEFAULT, IPL_NONE);
-	mutex_init(&sc->sc_kqlock, MUTEX_DEFAULT, IPL_VM);
-
-	selinit(&sc->sc_rsel);
 }
 
 /*

Reply via email to