47 lines
1.9 KiB
Diff
47 lines
1.9 KiB
Diff
|
commit c8f08e487672afcaa53629bddbc6703b5d90e846
|
||
|
Author: Jim Fehlig <jfehlig@suse.com>
|
||
|
Date: Mon Jul 11 17:26:48 2016 -0600
|
||
|
|
||
|
systemd: fix ready notification on abstract socket
|
||
|
|
||
|
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>
|
||
|
|
||
|
Index: libvirt-2.0.0/src/util/virsystemd.c
|
||
|
===================================================================
|
||
|
--- libvirt-2.0.0.orig/src/util/virsystemd.c
|
||
|
+++ libvirt-2.0.0/src/util/virsystemd.c
|
||
|
@@ -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");
|