Message ID | 1290784935-27258-1-git-send-email-corentincj@iksaif.net |
---|---|
State | New |
Headers | show |
On Fri, 26 Nov 2010, Corentin Chary wrote: > agraf reported that qemu_mutex_destroy(vs->output_mutex) was failing > in vnc_disconnect_finish() when the vnc client was disconnected while > updating the screen. > > It's because vnc_worker_thread_loop() tries to unlock the mutex while > not locked. The unlocking call doesn't fail (pthread bug ?), but > the destroy call does. > Not bug but rather (expected in the absence of PTHREAD_MUTEX_ERRORCHECK) undefined behaviour [1] [1] http://www.opengroup.org/onlinepubs/7990989775/xsh/pthread_mutex_unlock.html
diff --git a/ui/vnc-jobs-async.c b/ui/vnc-jobs-async.c index 6e9cf08..0b5d750 100644 --- a/ui/vnc-jobs-async.c +++ b/ui/vnc-jobs-async.c @@ -227,6 +227,10 @@ static int vnc_worker_thread_loop(VncJobQueue *queue) if (job->vs->csock == -1) { vnc_unlock_display(job->vs->vd); + /* output mutex must be locked before going to + * disconnected: + */ + vnc_lock_output(job->vs); goto disconnected; }
agraf reported that qemu_mutex_destroy(vs->output_mutex) was failing in vnc_disconnect_finish() when the vnc client was disconnected while updating the screen. It's because vnc_worker_thread_loop() tries to unlock the mutex while not locked. The unlocking call doesn't fail (pthread bug ?), but the destroy call does. Signed-off-by: Corentin Chary <corentincj@iksaif.net> --- ui/vnc-jobs-async.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-)