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;
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to