svn commit: r220800 - in head/sys: netgraph netinet/ipfw netinet/libalias

Gleb Smirnoff glebius at FreeBSD.org
Mon Apr 18 20:07:09 UTC 2011


Author: glebius
Date: Mon Apr 18 20:07:08 2011
New Revision: 220800
URL: http://svn.freebsd.org/changeset/base/220800

Log:
  LibAliasInit() should allocate memory with M_WAITOK flag. Modify it
  and its callers.

Modified:
  head/sys/netgraph/ng_nat.c
  head/sys/netinet/ipfw/ip_fw_nat.c
  head/sys/netinet/libalias/alias_db.c

Modified: head/sys/netgraph/ng_nat.c
==============================================================================
--- head/sys/netgraph/ng_nat.c	Mon Apr 18 19:20:47 2011	(r220799)
+++ head/sys/netgraph/ng_nat.c	Mon Apr 18 20:07:08 2011	(r220800)
@@ -276,10 +276,6 @@ ng_nat_constructor(node_p node)
 
 	/* Init aliasing engine. */
 	priv->lib = LibAliasInit(NULL);
-	if (priv->lib == NULL) {
-		free(priv, M_NETGRAPH);
-		return (ENOMEM);
-	}
 
 	/* Set same ports on. */
 	(void )LibAliasSetMode(priv->lib, PKT_ALIAS_SAME_PORTS,

Modified: head/sys/netinet/ipfw/ip_fw_nat.c
==============================================================================
--- head/sys/netinet/ipfw/ip_fw_nat.c	Mon Apr 18 19:20:47 2011	(r220799)
+++ head/sys/netinet/ipfw/ip_fw_nat.c	Mon Apr 18 20:07:08 2011	(r220800)
@@ -359,28 +359,17 @@ ipfw_nat_cfg(struct sockopt *sopt)
 	IPFW_WLOCK(chain);
 	ptr = lookup_nat(&chain->nat, ser_n->id);
 	if (ptr == NULL) {
+		IPFW_WUNLOCK(chain);
 		/* New rule: allocate and init new instance. */
-		ptr = malloc(sizeof(struct cfg_nat),
-		    M_IPFW, M_NOWAIT | M_ZERO);
-		if (ptr == NULL) {
-			IPFW_WUNLOCK(chain);
-			free(buf, M_IPFW);
-			return (ENOSPC);
-		}
+		ptr = malloc(sizeof(struct cfg_nat), M_IPFW, M_WAITOK | M_ZERO);
 		ptr->lib = LibAliasInit(NULL);
-		if (ptr->lib == NULL) {
-			IPFW_WUNLOCK(chain);
-			free(ptr, M_IPFW);
-			free(buf, M_IPFW);
-			return (EINVAL);
-		}
 		LIST_INIT(&ptr->redir_chain);
 	} else {
 		/* Entry already present: temporarly unhook it. */
 		LIST_REMOVE(ptr, _next);
 		flush_nat_ptrs(chain, ser_n->id);
+		IPFW_WUNLOCK(chain);
 	}
-	IPFW_WUNLOCK(chain);
 
 	/*
 	 * Basic nat configuration.
@@ -407,6 +396,10 @@ ipfw_nat_cfg(struct sockopt *sopt)
 	add_redir_spool_cfg(&buf[(sizeof(struct cfg_nat))], ptr);
 	free(buf, M_IPFW);
 	IPFW_WLOCK(chain);
+	/*
+	 * XXXGL race here: another ipfw_nat_cfg() may already inserted
+	 * entry with the same ser_n->id.
+	 */
 	LIST_INSERT_HEAD(&chain->nat, ptr, _next);
 	IPFW_WUNLOCK(chain);
 	return (0);

Modified: head/sys/netinet/libalias/alias_db.c
==============================================================================
--- head/sys/netinet/libalias/alias_db.c	Mon Apr 18 19:20:47 2011	(r220799)
+++ head/sys/netinet/libalias/alias_db.c	Mon Apr 18 20:07:08 2011	(r220800)
@@ -2490,9 +2490,14 @@ LibAliasInit(struct libalias *la)
 #endif
 
 	if (la == NULL) {
+#ifdef _KERNEL
+#undef malloc	/* XXX: ugly */
+		la = malloc(sizeof *la, M_ALIAS, M_WAITOK | M_ZERO);
+#else
 		la = calloc(sizeof *la, 1);
 		if (la == NULL)
 			return (la);
+#endif
 
 #ifndef	_KERNEL		/* kernel cleans up on module unload */
 		if (LIST_EMPTY(&instancehead))


More information about the svn-src-head mailing list