svn commit: r222690 - head/sys/netinet

Robert Watson rwatson at FreeBSD.org
Sat Jun 4 16:26:03 UTC 2011


Author: rwatson
Date: Sat Jun  4 16:26:02 2011
New Revision: 222690
URL: http://svn.freebsd.org/changeset/base/222690

Log:
  IP divert sockets use their inpcbinfo for port reservation, although not
  for lookup.  I missed its call to in_pcbbind() when preparing previous
  patches, which would lead to a lock assertion failure (although problem
  not an actual race condition due to global pcbinfo locks providing
  required synchronisation -- in this particular case only).  This change
  adds the missing locking of the pcbhash lock.
  
  (Existing comments in the ipdivert code question the need for using the
  global hash to manage the namespace, as really it's a simple port
  namespace and not an address/port namespace.  Also, although in_pcbbind
  is used to manage reservations, the hash tables aren't used for lookup.
  It might be a good idea to make them use hashed lookup, or to use a
  different reservation scheme.)
  
  Reviewed by:    bz
  Reported by:    Kristof Provost <kristof at sigsegv.be>
  Sponsored by:   Juniper Networks

Modified:
  head/sys/netinet/ip_divert.c

Modified: head/sys/netinet/ip_divert.c
==============================================================================
--- head/sys/netinet/ip_divert.c	Sat Jun  4 16:25:12 2011	(r222689)
+++ head/sys/netinet/ip_divert.c	Sat Jun  4 16:26:02 2011	(r222690)
@@ -530,7 +530,9 @@ div_bind(struct socket *so, struct socka
 	((struct sockaddr_in *)nam)->sin_addr.s_addr = INADDR_ANY;
 	INP_INFO_WLOCK(&V_divcbinfo);
 	INP_WLOCK(inp);
+	INP_HASH_WLOCK(&V_divcbinfo);
 	error = in_pcbbind(inp, nam, td->td_ucred);
+	INP_HASH_WUNLOCK(&V_divcbinfo);
 	INP_WUNLOCK(inp);
 	INP_INFO_WUNLOCK(&V_divcbinfo);
 	return error;


More information about the svn-src-head mailing list