natd broken for days

Gleb Smirnoff glebius at freebsd.org
Thu Nov 11 09:27:03 PST 2004


On Thu, Nov 11, 2004 at 05:40:29PM +0100, Poul-Henning Kamp wrote:
P> In message <20041111163638.GA700 at laptop.6bone.nl>, Mark Santcroos writes:
P> >On Thu, Nov 11, 2004 at 05:25:23AM -0800, Sean McNeil wrote:
P> >> It has been reported that both amd64 and i386 architectures will panic
P> >> in natd by jumping to address 0.  There has been no discussion since the
P> >> reports, however, and I was wondering if anyone is looking into it.
P> >
P> >This should fix it.
P> 
P> We have a problem if that is the case, because then ipdivert
P> doesn't run through net_init_domain() :-(

Poul-Henning, can you review attached patch?

Conrad, can you test it?

-- 
Totus tuus, Glebius.
GLEBIUS-RIPN GLEB-RIPE
-------------- next part --------------
Index: uipc_domain.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/uipc_domain.c,v
retrieving revision 1.39
diff -u -r1.39 uipc_domain.c
--- uipc_domain.c	8 Nov 2004 14:44:52 -0000	1.39
+++ uipc_domain.c	11 Nov 2004 17:23:42 -0000
@@ -97,6 +97,34 @@
 	.pru_sosetlabel =	pru_sosetlabel_null
 };
 
+static void
+protosw_init(struct protosw *pr)
+{
+	struct pr_usrreqs *pu;
+
+	pu = pr->pr_usrreqs;
+	KASSERT(pu != NULL, ("protosw_init: %ssw[%d] has no usrreqs!",
+	    pr->pr_domain->dom_name,
+	    (int)(pr - pr->pr_domain->dom_protosw)));
+
+#define DEFAULT(foo, bar)	if ((foo) == NULL)  (foo) = (bar)
+	DEFAULT(pu->pru_accept, pru_accept_notsupp);
+	DEFAULT(pu->pru_connect, pru_connect_notsupp);
+	DEFAULT(pu->pru_connect2, pru_connect2_notsupp);
+	DEFAULT(pu->pru_control, pru_control_notsupp);
+	DEFAULT(pu->pru_listen, pru_listen_notsupp);
+	DEFAULT(pu->pru_rcvd, pru_rcvd_notsupp);
+	DEFAULT(pu->pru_rcvoob, pru_rcvoob_notsupp);
+	DEFAULT(pu->pru_sense, pru_sense_null);
+	DEFAULT(pu->pru_sosend, sosend);
+	DEFAULT(pu->pru_soreceive, soreceive);
+	DEFAULT(pu->pru_sopoll, sopoll);
+	DEFAULT(pu->pru_sosetlabel, pru_sosetlabel_null);
+#undef DEFAULT
+	if (pr->pr_init)
+		(*pr->pr_init)();
+}
+
 /*
  * Add a new protocol domain to the list of supported domains
  * Note: you cant unload it again because a socket may be using it.
@@ -106,33 +134,11 @@
 net_init_domain(struct domain *dp)
 {
 	struct protosw *pr;
-	struct pr_usrreqs *pu;
 
 	if (dp->dom_init)
 		(*dp->dom_init)();
-	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++){
-		pu = pr->pr_usrreqs;
-		KASSERT(pu != NULL, 
-		    ("domaininit: %ssw[%d] has no usrreqs!",
-		    dp->dom_name, (int)(pr - dp->dom_protosw)));
-#define DEFAULT(foo, bar)	if ((foo) == NULL)  (foo) = (bar)
-		DEFAULT(pu->pru_accept, pru_accept_notsupp);
-		DEFAULT(pu->pru_connect, pru_connect_notsupp);
-		DEFAULT(pu->pru_connect2, pru_connect2_notsupp);
-		DEFAULT(pu->pru_control, pru_control_notsupp);
-		DEFAULT(pu->pru_listen, pru_listen_notsupp);
-		DEFAULT(pu->pru_rcvd, pru_rcvd_notsupp);
-		DEFAULT(pu->pru_rcvoob, pru_rcvoob_notsupp);
-		DEFAULT(pu->pru_sense, pru_sense_null);
-		DEFAULT(pu->pru_sosend, sosend);
-		DEFAULT(pu->pru_soreceive, soreceive);
-		DEFAULT(pu->pru_sopoll, sopoll);
-		DEFAULT(pu->pru_sosetlabel, pru_sosetlabel_null);
-#undef DEFAULT
-
-		if (pr->pr_init)
-			(*pr->pr_init)();
-	}
+	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
+		protosw_init(pr);
 	/*
 	 * update global information about maximums
 	 */
@@ -298,8 +304,7 @@
 	mtx_unlock(&Giant);
 
 	/* Initialize and activate the protocol. */
-	if (fpr->pr_init)
-		(fpr->pr_init)();
+	protosw_init(fpr);
 
 	return (0);
 }


More information about the freebsd-current mailing list