qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Eric Blake <eblake@redhat.com>
To: "Daniel P. Berrangé" <berrange@redhat.com>,
	"xiaoqiang zhao" <zxq_yx_007@163.com>
Cc: armbru@redhat.com, qemu-devel@nongnu.org, kraxel@redhat.com
Subject: Re: [PATCH v2] qemu-sockets: add abstract UNIX domain socket support
Date: Mon, 27 Apr 2020 08:47:29 -0500	[thread overview]
Message-ID: <c11a26d1-9565-a8df-ed98-65a172fb7227@redhat.com> (raw)
In-Reply-To: <20200423090006.GA1077680@redhat.com>

On 4/23/20 4:00 AM, Daniel P. Berrangé wrote:
> Adding Eric & Markus for QAPI modelling questions
> 
> On Thu, Apr 23, 2020 at 11:56:40AM +0800, xiaoqiang zhao wrote:
>> unix_connect_saddr now support abstract address type
>>
>> By default qemu does not support abstract UNIX domain
>> socket address. Add this ability to make qemu handy
>> when abstract address is needed.
> 
> Was that a specific app you're using with QEMU that needs this ?
> 
>> Abstract address is marked by prefixing the address name with a '@'.
> 
> For full support of the abstract namespace we would ned to allow
> the "sun_path" to contain an arbitrary mix of NULs and non-NULs
> characters, and allow connect() @addrlen to be an arbitrary size.
> 
> This patch only allows a single initial NUL, and reqiures @addrlen
> to be the full size of sun_path, padding with trailing NULs. This
> limitation is impossible to lift with QEMU's current approach to
> UNIX sockets, as it relies on passing around a NULL terminated
> string, so there's no way to have embedded NULs. Since there's
> no explicit length, we have to chooose between forcing the full
> sun_path size as @addrlen, or forcing the string length as the
> @addrlen value.
> 
> IIUC, socat makes the latter decision by default, but has a
> flag to switch to the former.
> 
>    [man socat]
>    unix-tightsocklen=[0|1]
>    On  socket  operations,  pass  a  socket  address  length that does not
>    include the whole struct sockaddr_un record but (besides  other  compo‐
>    nents)  only  the  relevant  part  of  the filename or abstract string.
>    Default is 1.
>    [/man]
> 
> This actually is supported for both abstract and non-abstract
> sockets, though IIUC this doesn't make a semantic difference
> for non-abstract sockets.

Yes, that matches my experience as well.  '^@a' length 2 is a different 
socket than '^@a^@' length three, but 'a' length 1 and 'a^@' length 2 
are the same socket because only non-abstract sockets end at the earlier 
of the first NUL or the length.

> 
> The point is we have four possible combinations
> 
>   NON-ABSTRACT + FULL SIZE
>   NON-ABSTRACT + MINIMAL SIZE  (default)

Two combinations, but only one behavior.

>   ABSTRACT + FULL SIZE
>   ABSTRACT + MINIMAL SIZE  (default)

And two more behaviors.

> 
> With your patch doing the latter, it means QEMU supports
> only two combinations
> 
>    NON+ABSTRACT + FULL SIZE
>    ABSTRACT + MINIMAL SIZE
> 
> and also can't use "@somerealpath" for a non-abstract
> socket, though admittedly this is unlikely.
> 
> Socat uses a special option to request use of abstract
> sockets. eg ABSTRACT:somepath, and automatically adds
> the leading NUL, so there's no need for a special "@"
> character. This means that UNIX:@somepath still resolves
> to a filesystem path and not a abstract socket path.

Yes, having an additional knob to express abstract sockets seems better 
than overloading a specific character (although @sockname is a relative 
name, and relative socket names already come with their own set of 
problems).

> 
> Finally, the patch as only added support for connect()
> not listen(). I think if QEMU wants to support abstract
> sockets we must do both, and also have unit tests added
> to tests/test-util-sockets.c

Indeed.

> 
> 
> The question is whether we're ok with this simple
> approach in QEMU, or should do a full approach with
> more explicit modelling.
> 
> ie should we change QAPI thus:
> 
> { 'struct': 'UnixSocketAddress',
>    'data': {
>      'path': 'str',
>      'tight': 'bool',
>      'abstract': 'bool' } }

You'd want to make 'tight' and 'abstract' optional, with defaults to the 
existing practice, but otherwise this looks sane to me.


> 
> where 'tight' is a flag indicating whether to set @addrlen
> to the minimal string length, or the maximum sun_path length.
> And 'abstract' indicates that we automagically add a leading
> NUL.
> 
> This would *not* allow for NULs in the middle of path,
> but I'm not so bothered about that, since I can't see that
> being widely used. If we really did need that it could be
> added via a 'base64': 'bool' flag, to indicate that @path
> is base64 encoded and thus may contain NULs

Agreed that this is less likely to be needed.

> 
>>From a CLI POV, this could be mapped to QAPI thus
> 
>   *  -chardev unix:somepath
> 
>        @path==somepath
>        @tight==false
>        @abstract==false
> 
>   *  -chardev unix:somepath,tight
> 
>        @path==somepath
>        @tight==true
>        @abstract==false
> 
>   *  -chardev unix-abstract:somepath
> 
>        @path==somepath
>        @tight==false
>        @abstract==true
> 
>   *  -chardev unix-abstract:somepath,tight
> 
>        @path==somepath
>        @tight==true
>        @abstract==true
> 

Also sounds reasonable to me.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org



      parent reply	other threads:[~2020-04-27 13:48 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-23  3:56 [PATCH v2] qemu-sockets: add abstract UNIX domain socket support xiaoqiang zhao
2020-04-23  9:00 ` Daniel P. Berrangé
2020-04-23 10:51   ` xiaoqiang.zhao
2020-04-26  2:06     ` xiaoqiang.zhao
2020-04-27 13:47   ` Eric Blake [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c11a26d1-9565-a8df-ed98-65a172fb7227@redhat.com \
    --to=eblake@redhat.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=zxq_yx_007@163.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).