libmpathcmd: use target length for unix socket sun_path
authorMartin Wilck <mwilck@suse.com>
Mon, 24 Jun 2019 09:27:32 +0000 (11:27 +0200)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Wed, 3 Jul 2019 06:30:44 +0000 (08:30 +0200)
Note that sun_path doesn't necessarily need to be 0-terminated for an abstract
socket name for ux_socket_listen(), this means we need to use memcpy to avoid
a spurious warning.

Signed-off-by: Martin Wilck <mwilck@suse.com>
libmpathcmd/mpath_cmd.c
libmultipath/uxsock.c

index b681311..f00bf7e 100644 (file)
@@ -103,8 +103,10 @@ int __mpath_connect(int nonblocking)
        memset(&addr, 0, sizeof(addr));
        addr.sun_family = AF_LOCAL;
        addr.sun_path[0] = '\0';
+       strncpy(&addr.sun_path[1], DEFAULT_SOCKET, sizeof(addr.sun_path) - 1);
        len = strlen(DEFAULT_SOCKET) + 1 + sizeof(sa_family_t);
-       strncpy(&addr.sun_path[1], DEFAULT_SOCKET, len);
+       if (len > sizeof(struct sockaddr_un))
+               len = sizeof(struct sockaddr_un);
 
        fd = socket(AF_LOCAL, SOCK_STREAM, 0);
        if (fd == -1)
index 7e5a144..9b4e978 100644 (file)
@@ -66,9 +66,12 @@ int ux_socket_listen(const char *name)
        memset(&addr, 0, sizeof(addr));
        addr.sun_family = AF_LOCAL;
        addr.sun_path[0] = '\0';
-       len = strlen(name) + 1 + sizeof(sa_family_t);
-       strncpy(&addr.sun_path[1], name, len);
+       len = strlen(name) + 1;
+       if (len >= sizeof(addr.sun_path))
+               len = sizeof(addr.sun_path) - 1;
+       memcpy(&addr.sun_path[1], name, len);
 
+       len += sizeof(sa_family_t);
        if (bind(fd, (struct sockaddr *)&addr, len) == -1) {
                condlog(3, "Couldn't bind to ux_socket, error %d", errno);
                close(fd);