svn commit: r260411 - head/sys/dev/netmap
Luigi Rizzo
luigi at FreeBSD.org
Tue Jan 7 21:14:29 UTC 2014
Author: luigi
Date: Tue Jan 7 21:14:28 2014
New Revision: 260411
URL: http://svnweb.freebsd.org/changeset/base/260411
Log:
fix use after free when releasing a netmap adapter.
Submitted by: Giuseppe Lettieri
Modified:
head/sys/dev/netmap/netmap.c
head/sys/dev/netmap/netmap_kern.h
Modified: head/sys/dev/netmap/netmap.c
==============================================================================
--- head/sys/dev/netmap/netmap.c Tue Jan 7 21:04:49 2014 (r260410)
+++ head/sys/dev/netmap/netmap.c Tue Jan 7 21:14:28 2014 (r260411)
@@ -2208,9 +2208,14 @@ netmap_detach(struct ifnet *ifp)
NMG_LOCK();
netmap_disable_all_rings(ifp);
- netmap_adapter_put(na);
- na->ifp = NULL;
- netmap_enable_all_rings(ifp);
+ if (!netmap_adapter_put(na)) {
+ /* someone is still using the adapter,
+ * tell them that the interface is gone
+ */
+ na->ifp = NULL;
+ /* give them a chance to notice */
+ netmap_enable_all_rings(ifp);
+ }
NMG_UNLOCK();
}
Modified: head/sys/dev/netmap/netmap_kern.h
==============================================================================
--- head/sys/dev/netmap/netmap_kern.h Tue Jan 7 21:04:49 2014 (r260410)
+++ head/sys/dev/netmap/netmap_kern.h Tue Jan 7 21:14:28 2014 (r260411)
@@ -899,11 +899,11 @@ void __netmap_adapter_get(struct netmap_
int __netmap_adapter_put(struct netmap_adapter *na);
#define netmap_adapter_put(na) \
- do { \
+ ({ \
struct netmap_adapter *__na = na; \
D("putting %p:%s (%d)", __na, NM_IFPNAME(__na->ifp), __na->na_refcount); \
__netmap_adapter_put(__na); \
- } while (0)
+ })
#else /* !NM_DEBUG_PUTGET */
More information about the svn-src-all
mailing list