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

Reply via email to