FreeBSD returns a socklen of sockaddr_storage when doing an accept on an unix STREAM socket. The current code will assume it means a sun_path larger than 0.
That breaks some tests like the one below which don't expect to find "unix::" on the logs. As a Linux abstract address would not have a more useful name either, it's better to check that sun_path starts with a non-zero byte and return 0 length in case it doesn't. 402: ovs-ofctl replace-flows with --bundle FAILED (ovs-ofctl.at:2928) 2016-07-08T12:44:30.068Z|00020|vconn|DBG|unix:: sent (Success): OFPT_HELLO (OF1.6) (xid=0x1): Signed-off-by: Thadeu Lima de Souza Cascardo <casca...@redhat.com> --- lib/socket-util-unix.c | 5 +++-- lib/socket-util.h | 3 ++- lib/stream-unix.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/socket-util-unix.c b/lib/socket-util-unix.c index 32f966d..5d4b88c 100644 --- a/lib/socket-util-unix.c +++ b/lib/socket-util-unix.c @@ -387,9 +387,10 @@ error: } int -get_unix_name_len(socklen_t sun_len) +get_unix_name_len(const struct sockaddr_un *sun, socklen_t sun_len) { - return (sun_len >= offsetof(struct sockaddr_un, sun_path) + return (sun_len >= offsetof(struct sockaddr_un, sun_path) && + sun->sun_path[0] != 0 ? sun_len - offsetof(struct sockaddr_un, sun_path) : 0); } diff --git a/lib/socket-util.h b/lib/socket-util.h index c3c1224..5bf76a4 100644 --- a/lib/socket-util.h +++ b/lib/socket-util.h @@ -21,6 +21,7 @@ #include <sys/types.h> #include <sys/socket.h> #include <sys/time.h> +#include <sys/un.h> #include <netinet/in.h> #include <stdbool.h> #include "openvswitch/types.h" @@ -84,7 +85,7 @@ int drain_rcvbuf(int fd); int make_unix_socket(int style, bool nonblock, const char *bind_path, const char *connect_path); -int get_unix_name_len(socklen_t sun_len); +int get_unix_name_len(const struct sockaddr_un *sun, socklen_t sun_len); /* Helpers for calling ioctl() on an AF_INET socket. */ struct ifreq; diff --git a/lib/stream-unix.c b/lib/stream-unix.c index cadd180..6424d3e 100644 --- a/lib/stream-unix.c +++ b/lib/stream-unix.c @@ -110,7 +110,7 @@ punix_accept(int fd, const struct sockaddr_storage *ss, size_t ss_len, struct stream **streamp) { const struct sockaddr_un *sun = (const struct sockaddr_un *) ss; - int name_len = get_unix_name_len(ss_len); + int name_len = get_unix_name_len(sun, ss_len); char name[128]; if (name_len > 0) { -- 2.7.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev