On Wed, Apr 29, 2015 at 01:08:37PM -0400, Cole Robinson wrote:
On 04/29/2015 08:32 AM, Martin Kletzander wrote:On Tue, Apr 28, 2015 at 08:13:19PM -0400, Cole Robinson wrote:This can cause permissions failures if qemu.conf user/group is changed.I assume the issue only exists if the socket already exists, am I right?Hmm, my commit message is bogus. I thought I had hit this issue before and didn't actually test that it was failing, only verifying that the end result appeared correct, which it does regardless of this patch. Sorry for the time wasting. Here's why it already kinda works without anything explicitly done by libvirt: you can't bind a unix socket to an existing path, it fails with 'Address already in use'. qemu handles this by unconditionally unlinking whatever path is manually passed it. Then the socket bind(2) call will implicitly recreate the passed in path. In the auto VNC case this effectively causes the permissions to be reset automagically: qemu can write to the parent /var/lib/libvirt/qemu directory, and the new socket gets proper user/group (from the qemu runtime user) and selinux label (from the parent directory) That said, what _will_ fail is if the user specified an explicit VNC socket path, but the parent directory was not writeable by qemu. Even if the socket path is readable/writeable by the user. Kinda confusing but not sure if anyone cares in practice. FWIW this is true of any usage of qemu's unix: handling.
Since it needs to unlink and create the socket, it must have the permissions to do so in that respective directory. As with disks etc., user is responsible for that unless it is auto-generated path. We cannot change the permissions on all parent directories. It's definitely worth mentioning that somewhere around the VNC socket stuff in the documentation.
So this patch doesn't add much... I'll drop it. There are a few other issues WRT VNC unix handling though: - Default listen address is still added to the runtime XML, though not to qemu CLI
I remember that when I was checking the code most of the conditions weren't exclusive, the only thing where using a socket effectively disabled listening was the command line preparation. I agree that all the parts should be in sync and not just try initializing and setting everything unconditionally.
- VNC sockets are left on disk after qemu shuts down... It's unclear what the fix is though. Maybe qemu should register an atexit handler to clean up unix sockets, since its the one that's actually creating them. Or maybe leave it as it is since it might cause user confusion with manually specific paths.
How is it done with monitor sockets? We are cleaning them in libvirt if we get the chance, right? That should be the same case with chardev channel sockets and everything else. Even VNC sockets.
Description: PGP signature