Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Jul 2011 18:38:11 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r224031 - head/sys/netgraph
Message-ID:  <201107141838.p6EIcBtJ041018@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107141838.p6EIcBtJ041018>