
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 :|