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(a)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