summaryrefslogtreecommitdiffstats
path: root/sys/netgraph
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2006-10-17 16:52:09 +0000
committerglebius <glebius@FreeBSD.org>2006-10-17 16:52:09 +0000
commit898bb51431e78e9ba8bb2cbddc7e19d1cf097cc9 (patch)
tree7fd183819c20b8152067500a6b0454c20409c428 /sys/netgraph
parent5e3b1e8a37b3b7c4cab982175252e5613e339696 (diff)
downloadFreeBSD-src-898bb51431e78e9ba8bb2cbddc7e19d1cf097cc9.zip
FreeBSD-src-898bb51431e78e9ba8bb2cbddc7e19d1cf097cc9.tar.gz
Some clenaup of ngs_rcvmsg():
- Inline ship_msg() into ngs_rcvmsg(). - Plug memory leak in case if no control socket present. - Remove malloc() and allocate the sockaddr on stack. - style(9).
Diffstat (limited to 'sys/netgraph')
-rw-r--r--sys/netgraph/ng_socket.c106
1 files changed, 46 insertions, 60 deletions
diff --git a/sys/netgraph/ng_socket.c b/sys/netgraph/ng_socket.c
index db08ecf..0e51b51 100644
--- a/sys/netgraph/ng_socket.c
+++ b/sys/netgraph/ng_socket.c
@@ -127,8 +127,6 @@ static int ng_connect_data(struct sockaddr *nam, struct ngpcb *pcbp);
static int ng_bind(struct sockaddr *nam, struct ngpcb *pcbp);
static int ngs_mod_event(module_t mod, int event, void *data);
-static int ship_msg(struct ngpcb *pcbp, struct ng_mesg *msg,
- struct sockaddr_ng *addr);
static void ng_socket_item_applied(void *context, int error);
/* Netgraph type descriptor */
@@ -786,42 +784,6 @@ ng_bind(struct sockaddr *nam, struct ngpcb *pcbp)
return (ng_name_node(priv->node, sap->sg_data));
}
-/*
- * Take a message and pass it up to the control socket associated
- * with the node.
- */
-static int
-ship_msg(struct ngpcb *pcbp, struct ng_mesg *msg, struct sockaddr_ng *addr)
-{
- struct socket *const so = pcbp->ng_socket;
- struct mbuf *mdata;
- int msglen;
- int error = 0;
-
- /* Copy the message itself into an mbuf chain */
- msglen = sizeof(struct ng_mesg) + msg->header.arglen;
- mdata = m_devget((caddr_t) msg, msglen, 0, NULL, NULL);
-
- /* Here we free the message, as we are the end of the line.
- * We need to do that regardless of whether we got mbufs. */
- NG_FREE_MSG(msg);
-
- if (mdata == NULL) {
- TRAP_ERROR;
- return (ENOBUFS);
- }
-
- /* Send it up to the socket */
- if (sbappendaddr(&so->so_rcv,
- (struct sockaddr *) addr, mdata, NULL) == 0) {
- TRAP_ERROR;
- m_freem(mdata);
- error = so->so_error = ENOBUFS;
- }
- sorwakeup(so);
- return (error);
-}
-
/***************************************************************
Netgraph node
***************************************************************/
@@ -873,20 +835,24 @@ ngs_rcvmsg(node_p node, item_p item, hook_p lasthook)
{
struct ngsock *const priv = NG_NODE_PRIVATE(node);
struct ngpcb *const pcbp = priv->ctlsock;
- struct sockaddr_ng *addr;
+ struct socket *const so = pcbp->ng_socket;
+ struct sockaddr_ng addr;
+ struct ng_mesg *msg;
+ struct mbuf *m;
+ ng_ID_t retaddr = NGI_RETADDR(item);
int addrlen;
int error = 0;
- struct ng_mesg *msg;
- ng_ID_t retaddr = NGI_RETADDR(item);
- char retabuf[32];
NGI_GET_MSG(item, msg);
- NG_FREE_ITEM(item); /* we have all we need */
+ NG_FREE_ITEM(item);
- /* Only allow mesgs to be passed if we have the control socket.
- * Data sockets can only support the generic messages. */
+ /*
+ * Only allow mesgs to be passed if we have the control socket.
+ * Data sockets can only support the generic messages.
+ */
if (pcbp == NULL) {
TRAP_ERROR;
+ NG_FREE_MSG(msg);
return (EINVAL);
}
@@ -911,27 +877,47 @@ ngs_rcvmsg(node_p node, item_p item, hook_p lasthook)
default:
error = EINVAL; /* unknown command */
}
- /* Free the message and return */
+ /* Free the message and return. */
NG_FREE_MSG(msg);
- return(error);
+ return (error);
+ }
+ /* Get the return address into a sockaddr. */
+ bzero(&addr, sizeof(addr));
+ addr.sg_len = sizeof(addr);
+ addr.sg_family = AF_NETGRAPH;
+ addrlen = snprintf((char *)&addr.sg_data, sizeof(addr.sg_data),
+ "[%x]:", retaddr);
+ if (addrlen < 0 || addrlen > sizeof(addr.sg_data)) {
+ printf("%s: snprintf([%x]) failed - %d\n", __func__, retaddr,
+ addrlen);
+ NG_FREE_MSG(msg);
+ return (EINVAL);
}
- /* Get the return address into a sockaddr */
- sprintf(retabuf,"[%x]:", retaddr);
- addrlen = strlen(retabuf);
- MALLOC(addr, struct sockaddr_ng *, addrlen + 4, M_NETGRAPH_PATH, M_NOWAIT);
- if (addr == NULL) {
+
+ /* Copy the message itself into an mbuf chain. */
+ m = m_devget((caddr_t)msg, sizeof(struct ng_mesg) + msg->header.arglen,
+ 0, NULL, NULL);
+
+ /*
+ * Here we free the message. We need to do that
+ * regardless of whether we got mbufs.
+ */
+ NG_FREE_MSG(msg);
+
+ if (m == NULL) {
TRAP_ERROR;
- return (ENOMEM);
+ return (ENOBUFS);
}
- addr->sg_len = addrlen + 3;
- addr->sg_family = AF_NETGRAPH;
- bcopy(retabuf, addr->sg_data, addrlen);
- addr->sg_data[addrlen] = '\0';
- /* Send it up */
- error = ship_msg(pcbp, msg, addr);
- FREE(addr, M_NETGRAPH_PATH);
+ /* Send it up to the socket. */
+ if (sbappendaddr(&so->so_rcv, (struct sockaddr *)&addr, m, NULL) == 0) {
+ TRAP_ERROR;
+ m_freem(m);
+ error = so->so_error = ENOBUFS;
+ }
+ sorwakeup(so);
+
return (error);
}
OpenPOWER on IntegriCloud