On 12.01.2012 11:13, Daniel P. Berrange wrote:
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
Thanks, pushed.
Michal