Patchwork vnc: qemu can die if the client is disconnected while updating screen

login
register
mail settings
Submitter Corentin Chary
Date Nov. 26, 2010, 3:22 p.m.
Message ID <1290784935-27258-1-git-send-email-corentincj@iksaif.net>
Download mbox | patch
Permalink /patch/73191/
State New
Headers show

Comments

Corentin Chary - Nov. 26, 2010, 3:22 p.m.
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(-)
malc - Nov. 26, 2010, 3:29 p.m.
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

Patch

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;
         }