summaryrefslogtreecommitdiffstats
path: root/sys/netgraph/ng_socket.c
diff options
context:
space:
mode:
authorbrian <brian@FreeBSD.org>1999-11-11 20:08:04 +0000
committerbrian <brian@FreeBSD.org>1999-11-11 20:08:04 +0000
commit30ceb7c670a3387ada379c6b921f203425f70ec3 (patch)
tree78390ab05860d62791ed0cd05c9184003e7342cb /sys/netgraph/ng_socket.c
parent2ececa4e38eb36e8492f6789ab235214af09adad (diff)
downloadFreeBSD-src-30ceb7c670a3387ada379c6b921f203425f70ec3.zip
FreeBSD-src-30ceb7c670a3387ada379c6b921f203425f70ec3.tar.gz
Provide an empty name to getsockname() if one hasn't been set up.
Ok'd (for now) by: julian
Diffstat (limited to 'sys/netgraph/ng_socket.c')
-rw-r--r--sys/netgraph/ng_socket.c43
1 files changed, 28 insertions, 15 deletions
diff --git a/sys/netgraph/ng_socket.c b/sys/netgraph/ng_socket.c
index b13fea3..65e09f5 100644
--- a/sys/netgraph/ng_socket.c
+++ b/sys/netgraph/ng_socket.c
@@ -370,23 +370,36 @@ ngd_connect(struct socket *so, struct sockaddr *nam, struct proc *p)
static int
ng_setsockaddr(struct socket *so, struct sockaddr **addr)
{
- struct ngpcb *const pcbp = sotongpcb(so);
- struct sockaddr *sa;
- int namelen;
+ struct ngpcb *pcbp;
+ struct sockaddr_ng *sg;
+ int sg_len, namelen, s;
- if (pcbp == 0)
+ /* Why isn't sg_data a `char[1]' ? :-( */
+ sg_len = sizeof(struct sockaddr_ng) - sizeof(sg->sg_data) + 1;
+
+ s = splnet();
+ pcbp = sotongpcb(so);
+ if (pcbp == 0) {
+ splx(s);
return (EINVAL);
- if (pcbp->sockdata->node->name != NULL) {
- namelen = strlen(pcbp->sockdata->node->name) + 3;
- MALLOC(sa, struct sockaddr *, namelen, M_SONAME, M_WAITOK);
- if (sa == NULL)
- return (ENOMEM);
- sa->sa_family = AF_NETGRAPH;
- sa->sa_len = namelen;
- strcpy(sa->sa_data, pcbp->sockdata->node->name);
- *addr = sa;
- } else
- *addr = NULL; /* XXX check this makes sense */
+ }
+
+ namelen = 0; /* silence compiler ! */
+
+ if (pcbp->sockdata->node->name != NULL)
+ sg_len += namelen = strlen(pcbp->sockdata->node->name);
+
+ MALLOC(sg, struct sockaddr_ng *, sg_len, M_SONAME, M_WAITOK);
+ bzero(sg, sg_len);
+
+ if (pcbp->sockdata->node->name != NULL)
+ bcopy(pcbp->sockdata->node->name, sg->sg_data, namelen);
+ splx(s);
+
+ sg->sg_len = sg_len;
+ sg->sg_family = AF_NETGRAPH;
+ *addr = (struct sockaddr *)sg;
+
return (0);
}
OpenPOWER on IntegriCloud