svn commit: r186493 - head/sys/kern

Robert Watson rwatson at FreeBSD.org
Thu Dec 25 11:32:38 UTC 2008


Author: rwatson
Date: Thu Dec 25 11:32:38 2008
New Revision: 186493
URL: http://svn.freebsd.org/changeset/base/186493

Log:
  Following the recent security advisory, add a comment describing our
  invariants and approach for protocol switch methods in protsw_init(),
  and also some KASSERT's for non-domain init entries in protocol
  switch tables: pru_abort and pru_send must both be implemented.
  
  For now, leave those assertions #if 0'd, since there are a few
  protocols that violate them in non-harmful ways.  Whether or not we
  should enforce pru_abort being implemented for non-stream protocols
  is an interesting question: currently abort is only invoked on stream
  sockets in situations where un-accepted sockets must be abruptly
  closed (i.e., close() on a listen socket with pending connections),
  but in principle it is useful for datagram sockets and most datagram
  socket types implement it.
  
  MFC after:	3 weeks

Modified:
  head/sys/kern/uipc_domain.c

Modified: head/sys/kern/uipc_domain.c
==============================================================================
--- head/sys/kern/uipc_domain.c	Thu Dec 25 10:18:35 2008	(r186492)
+++ head/sys/kern/uipc_domain.c	Thu Dec 25 11:32:38 2008	(r186493)
@@ -110,6 +110,28 @@ protosw_init(struct protosw *pr)
 	    pr->pr_domain->dom_name,
 	    (int)(pr - pr->pr_domain->dom_protosw)));
 
+	/*
+	 * Protocol switch methods fall into three categories: mandatory,
+	 * mandatory but protosw_init() provides a default, and optional.
+	 *
+	 * For true protocols (i.e., pru_attach != NULL), KASSERT truly
+	 * mandatory methods with no defaults, and initialize defaults for
+	 * other mandatory methods if the protocol hasn't defined an
+	 * implementation (NULL function pointer).
+	 */
+#if 0
+	if (pu->pru_attach != NULL) {
+		KASSERT(pu->pru_abort != NULL,
+		    ("protosw_init: %ssw[%d] pru_abort NULL",
+		    pr->pr_domain->dom_name,
+		    (int)(pr - pr->pr_domain->dom_protosw)));
+		KASSERT(pu->pru_send != NULL,
+		    ("protosw_init: %ssw[%d] pru_send NULL",
+		    pr->pr_domain->dom_name,
+		    (int)(pr - pr->pr_domain->dom_protosw)));
+	}
+#endif
+
 #define DEFAULT(foo, bar)	if ((foo) == NULL)  (foo) = (bar)
 	DEFAULT(pu->pru_accept, pru_accept_notsupp);
 	DEFAULT(pu->pru_bind, pru_bind_notsupp);


More information about the svn-src-head mailing list