On Thu, Jan 12, 2012 at 09:54:15AM +0100, Michal Privoznik wrote: > If client stream does not have any data to sink and neither received > EOF, a dummy packet is sent to the daemon signalising client is ready to > sink some data. However, after we added event loop to client a race may > occur: > > Thread 1 calls virNetClientStreamRecvPacket and since no data are cached > nor stream has EOF, it decides to send dummy packet to server which will > sent some data in turn. However, during this decision and actual message > exchange with server - > > Thread 2 receives last stream data from server. Therefore an EOF is set > on stream and if there is a call waiting (which is not yet) it is woken > up. However, Thread 1 haven't sent anything so far, so there is no call > to be woken up. So this thread sent dummy packet to daemon, which > ignores that as no stream is associated with such packet and therefore > no reply will ever come. > > This race causes client to hang indefinitely. > --- > diff to v1: > -moved client locking one level higher > -checking for stream EOF one level higher too > > src/rpc/virnetclient.c | 51 +++++++++++++++++++++++++++++++++++++----- > src/rpc/virnetclient.h | 3 ++ > src/rpc/virnetclientstream.c | 7 +++++- > src/rpc/virnetclientstream.h | 2 + > 4 files changed, 56 insertions(+), 7 deletions(-) ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list