]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
systemd: fix ready notification on abstract socket
authorJim Fehlig <jfehlig@suse.com>
Mon, 11 Jul 2016 23:26:48 +0000 (17:26 -0600)
committerJim Fehlig <jfehlig@suse.com>
Tue, 12 Jul 2016 19:53:51 +0000 (13:53 -0600)
At least with systemd v210, NOTIFY_SOCKET is abstact, e.g.
@/org/freedesktop/systemd1/notify. sendmsg() fails on such a socket
with "Connection refused". The unix(7) man page contains the following
details wrt abstract socket addresses

abstract: an abstract socket address is distinguished (from a
          pathname socket) by the fact that sun_path[0] is a null byte
          ('\0').  The socket's address in this namespace is given by the
          additional bytes in sun_path that are covered by the specified
          length of the address structure.  (Null bytes in the name have
          no special significance.)

So we need to be more precise about the address length, setting it to
the sizeof sa_family_t + length of address copied to sun_path instead
of setting it to the sizeof the entire sockaddr_un struct.

Resolves: https://bugzilla.opensuse.org/show_bug.cgi?id=987668
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
src/util/virsystemd.c

index 871db7ee91735fe9ff1330fcbb71501fa4720a63..969cd681b158cf35bccad097d35833d1f256afe0 100644 (file)
@@ -495,7 +495,6 @@ virSystemdNotifyStartup(void)
     };
     struct msghdr mh = {
         .msg_name = &un,
-        .msg_namelen = sizeof(un),
         .msg_iov = &iov,
         .msg_iovlen = 1,
     };
@@ -515,6 +514,8 @@ virSystemdNotifyStartup(void)
     if (un.sun_path[0] == '@')
         un.sun_path[0] = '\0';
 
+    mh.msg_namelen = offsetof(struct sockaddr_un, sun_path) + strlen(path);
+
     fd = socket(AF_UNIX, SOCK_DGRAM, 0);
     if (fd < 0) {
         VIR_WARN("Unable to create socket FD");