svn commit: r234223 - projects/pf/head/sys/contrib/pf/net

Gleb Smirnoff glebius at FreeBSD.org
Fri Apr 13 12:53:57 UTC 2012


Author: glebius
Date: Fri Apr 13 12:53:56 2012
New Revision: 234223
URL: http://svn.freebsd.org/changeset/base/234223

Log:
  - Don't use M_WAITOK when holding locks in pfi_dynaddr_setup().
  - While here, make pfi_dynaddr_setup() and pf_tbladdr_setup()
    return more informative errnos. Pass these errnos to applocation,
    where it can be done easily.

Modified:
  projects/pf/head/sys/contrib/pf/net/pf.c
  projects/pf/head/sys/contrib/pf/net/pf_if.c
  projects/pf/head/sys/contrib/pf/net/pf_ioctl.c

Modified: projects/pf/head/sys/contrib/pf/net/pf.c
==============================================================================
--- projects/pf/head/sys/contrib/pf/net/pf.c	Fri Apr 13 11:12:18 2012	(r234222)
+++ projects/pf/head/sys/contrib/pf/net/pf.c	Fri Apr 13 12:53:56 2012	(r234223)
@@ -1523,7 +1523,7 @@ pf_tbladdr_setup(struct pf_ruleset *rs, 
 	if (aw->type != PF_ADDR_TABLE)
 		return (0);
 	if ((aw->p.tbl = pfr_attach_table(rs, aw->v.tblname)) == NULL)
-		return (1);
+		return (ENOMEM);
 	return (0);
 }
 

Modified: projects/pf/head/sys/contrib/pf/net/pf_if.c
==============================================================================
--- projects/pf/head/sys/contrib/pf/net/pf_if.c	Fri Apr 13 11:12:18 2012	(r234222)
+++ projects/pf/head/sys/contrib/pf/net/pf_if.c	Fri Apr 13 12:53:56 2012	(r234223)
@@ -394,17 +394,16 @@ pfi_dynaddr_setup(struct pf_addr_wrap *a
 
 	if (aw->type != PF_ADDR_DYNIFTL)
 		return (0);
-	/* XXX: revisit! */
-	if ((dyn = uma_zalloc(V_pfi_addr_z, M_WAITOK | M_ZERO))
-	    == NULL)
-		return (1);
+
+	if ((dyn = uma_zalloc(V_pfi_addr_z, M_NOWAIT | M_ZERO)) == NULL)
+		return (ENOMEM);
 
 	if (!strcmp(aw->v.ifname, "self"))
 		dyn->pfid_kif = pfi_kif_get(IFG_ALL);
 	else
 		dyn->pfid_kif = pfi_kif_get(aw->v.ifname);
 	if (dyn->pfid_kif == NULL) {
-		rv = 1;
+		rv = ENOENT;
 		goto _bad;
 	}
 	pfi_kif_ref(dyn->pfid_kif, PFI_KIF_REF_RULE);
@@ -425,12 +424,12 @@ pfi_dynaddr_setup(struct pf_addr_wrap *a
 		snprintf(tblname + strlen(tblname),
 		    sizeof(tblname) - strlen(tblname), "/%d", dyn->pfid_net);
 	if ((ruleset = pf_find_or_create_ruleset(PF_RESERVED_ANCHOR)) == NULL) {
-		rv = 1;
+		rv = ENOMEM;
 		goto _bad;
 	}
 
 	if ((dyn->pfid_kt = pfr_attach_table(ruleset, tblname)) == NULL) {
-		rv = 1;
+		rv = ENOMEM;
 		goto _bad;
 	}
 

Modified: projects/pf/head/sys/contrib/pf/net/pf_ioctl.c
==============================================================================
--- projects/pf/head/sys/contrib/pf/net/pf_ioctl.c	Fri Apr 13 11:12:18 2012	(r234222)
+++ projects/pf/head/sys/contrib/pf/net/pf_ioctl.c	Fri Apr 13 12:53:56 2012	(r234223)
@@ -999,11 +999,13 @@ static int
 pf_addr_setup(struct pf_ruleset *ruleset, struct pf_addr_wrap *addr,
     sa_family_t af)
 {
-	if (pfi_dynaddr_setup(addr, af) ||
-	    pf_tbladdr_setup(ruleset, addr))
-		return (EINVAL);
+	int error;
 
-	return (0);
+	error = pfi_dynaddr_setup(addr, af);
+	if (error == 0)
+		error = pf_tbladdr_setup(ruleset, addr);
+
+	return (error);
 }
 
 static void
@@ -2292,12 +2294,12 @@ DIOCGETSTATES_full:
 			}
 			pfi_kif_ref(pa->kif, PFI_KIF_REF_RULE);
 		}
-		if (pfi_dynaddr_setup(&pa->addr, pp->af)) {
+		error = pfi_dynaddr_setup(&pa->addr, pp->af);
+		if (error) {
 			pfi_dynaddr_remove(&pa->addr);
 			pfi_kif_unref(pa->kif, PFI_KIF_REF_RULE);
 			PF_UNLOCK();
 			uma_zfree(V_pf_pooladdr_z, pa);
-			error = EINVAL;
 			break;
 		}
 		TAILQ_INSERT_TAIL(&V_pf_pabuf, pa, entries);
@@ -2418,13 +2420,13 @@ DIOCGETSTATES_full:
 				pfi_kif_ref(newpa->kif, PFI_KIF_REF_RULE);
 			} else
 				newpa->kif = NULL;
-			if (pfi_dynaddr_setup(&newpa->addr, pca->af) ||
-			    pf_tbladdr_setup(ruleset, &newpa->addr)) {
+			if ((error = pfi_dynaddr_setup(&newpa->addr,
+			    pca->af)) != 0 || ((error =
+			    pf_tbladdr_setup(ruleset, &newpa->addr)) != 0 )) {
 				pfi_dynaddr_remove(&newpa->addr);
 				pfi_kif_unref(newpa->kif, PFI_KIF_REF_RULE);
 				PF_UNLOCK();
 				uma_zfree(V_pf_pooladdr_z, newpa);
-				error = EINVAL;
 				break;
 			}
 		}


More information about the svn-src-projects mailing list