On Thu, Mar 05, 2020 at 10:06:53AM +0100, Andrea Bolognani wrote:
On Fri, 2020-02-28 at 16:56 +0100, Michal Privoznik wrote:
> I've found that if my virtlogd is socket activated but the daemon
> doesn't run yet, then the virt-qemu-run is killed right after it
> tries to start the domain. The problem is that because the default
> setting is to use virtlogd, the domain create code tries to
> connect to virtlogd socket, which in turn tries to detect who is
> connecting (virNetSocketGetUNIXIdentity()) and as a part of it,
> it will try to open /proc/${PID_OF_SHIM}/stat which is denied by
> SELinux:
>
> type=AVC msg=audit(1582903501.927:323): avc: denied { search } for \
> pid=1210 comm="virtlogd" name="1843" dev="proc"
ino=37224 \
> scontext=system_u:system_r:virtlogd_t:s0-s0:c0.c1023 \
> tcontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 tclass=dir \
> permissive=0
>
> Virtlogd reacts by closing the connection which the shim sees as
> SIGPIPE. Since the default response to the signal is Term, we
> don't even get to reporting any error nor to removing the
> temporary directory.
While I've been hitting this communication issue with virtlogd
consistently, I haven't been able to reproduce the exact sympthoms
you list: more specifically, the AVC doesn't show up in audit.log,
and virt-qemu-run not only reports the error but successfully cleans
up after itself.
[...]
> +++ b/src/qemu/qemu_shim.c
> @@ -150,6 +150,7 @@ int main(int argc, char **argv)
> signal(SIGINT, qemuShimSigShutdown);
> signal(SIGQUIT, qemuShimSigShutdown);
> signal(SIGHUP, qemuShimSigShutdown);
> + signal(SIGPIPE, SIG_IGN);
Either way, I'm not convinced this is the right fix: if virt-qemu-run
is unable to communicate with virtlogd, that is a serious issue that
should prevent the application from continuing. Or does this change
only make it so virt-qemu-run does not abort immediately but rather
gets far enough that it can report the error and clean up? Again, not
being able to reproduce the original issue locally makes it difficult
to validate the fix :)
Regardless of the actual problem faced, ignoring SIGPIPE is the right
thing todo for all programs. They'll then process normal error returns
from write()
Regards,
Daniel
--
|:
https://berrange.com -o-
https://www.flickr.com/photos/dberrange :|
|:
https://libvirt.org -o-
https://fstop138.berrange.com :|
|:
https://entangle-photo.org -o-
https://www.instagram.com/dberrange :|