svn commit: r224031 - head/sys/netgraph

Gleb Smirnoff glebius at FreeBSD.org
Thu Jul 14 18:38:11 UTC 2011


Author: glebius
Date: Thu Jul 14 18:38:10 2011
New Revision: 224031
URL: http://svn.freebsd.org/changeset/base/224031

Log:
  In ng_attach_cntl() first allocate things that may fail, and then
  do the rest of initialization. This simplifies code and fixes
  a double free in failure scenario.
  
  Reviewed by:	bz

Modified:
  head/sys/netgraph/ng_socket.c

Modified: head/sys/netgraph/ng_socket.c
==============================================================================
--- head/sys/netgraph/ng_socket.c	Thu Jul 14 18:37:10 2011	(r224030)
+++ head/sys/netgraph/ng_socket.c	Thu Jul 14 18:38:10 2011	(r224031)
@@ -525,33 +525,32 @@ ng_attach_cntl(struct socket *so)
 {
 	struct ngsock *priv;
 	struct ngpcb *pcbp;
+	node_p node;
 	int error;
 
-	/* Allocate node private info */
-	priv = malloc(sizeof(*priv), M_NETGRAPH_SOCK, M_WAITOK | M_ZERO);
-
 	/* Setup protocol control block */
-	if ((error = ng_attach_common(so, NG_CONTROL)) != 0) {
-		free(priv, M_NETGRAPH_SOCK);
+	if ((error = ng_attach_common(so, NG_CONTROL)) != 0)
 		return (error);
-	}
 	pcbp = sotongpcb(so);
 
-	/* Link the pcb the private data. */
-	priv->ctlsock = pcbp;
-	pcbp->sockdata = priv;
-	priv->refs++;
-
-	/* Initialize mutex. */
-	mtx_init(&priv->mtx, "ng_socket", NULL, MTX_DEF);
-
 	/* Make the generic node components */
-	if ((error = ng_make_node_common(&typestruct, &priv->node)) != 0) {
-		free(priv, M_NETGRAPH_SOCK);
+	if ((error = ng_make_node_common(&typestruct, &node)) != 0) {
 		ng_detach_common(pcbp, NG_CONTROL);
 		return (error);
 	}
 
+	/* Allocate node private info */
+	priv = malloc(sizeof(*priv), M_NETGRAPH_SOCK, M_WAITOK | M_ZERO);
+
+	/* Initialize mutex. */
+	mtx_init(&priv->mtx, "ng_socket", NULL, MTX_DEF);
+
+	/* Link the pcb the private data. */
+	priv->ctlsock = pcbp;
+	pcbp->sockdata = priv;
+	priv->refs++;
+	priv->node = node;
+
 	/* Store a hint for netstat(1). */
 	priv->node_id = priv->node->nd_ID;
 


More information about the svn-src-all mailing list