diff options
author | brian <brian@FreeBSD.org> | 1999-11-11 20:08:04 +0000 |
---|---|---|
committer | brian <brian@FreeBSD.org> | 1999-11-11 20:08:04 +0000 |
commit | 30ceb7c670a3387ada379c6b921f203425f70ec3 (patch) | |
tree | 78390ab05860d62791ed0cd05c9184003e7342cb /sys | |
parent | 2ececa4e38eb36e8492f6789ab235214af09adad (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/netgraph/ng_socket.c | 43 |
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); } |