[libvirt] [PATCH] systemd: fix ready notification on abstract socket
Jim Fehlig
jfehlig at suse.com
Tue Jul 12 17:04:32 UTC 2016
Daniel P. Berrange wrote:
> On Mon, Jul 11, 2016 at 05:35:03PM -0600, Jim Fehlig wrote:
>> 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 at suse.com>
>> ---
>> src/util/virsystemd.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/src/util/virsystemd.c b/src/util/virsystemd.c
>> index 871db7e..1b5e9fe 100644
>> --- a/src/util/virsystemd.c
>> +++ b/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,
>> };
>> @@ -521,6 +520,7 @@ virSystemdNotifyStartup(void)
>> return;
>> }
>>
>> + mh.msg_namelen = sizeof(sa_family_t) + strlen(path);
>
> I'm wondering how safe sizeof(sa_family_t) is. Might it be better to
> use offsetof(struct sockaddr_un, sun_path) + strlen(path)
Yes, I think that is safer. V2 on the way...
Regards,
Jim
More information about the libvir-list
mailing list