Skip to content

Commit

Permalink
vnc: fix possible uninitialized removals
Browse files Browse the repository at this point in the history
Some VncState values are not initialized before the Websocket handshake.
If it fails QEMU segfaults during the cleanup. To prevent this behavior
intialization checks are added.

Signed-off-by: Tim Hardeck <thardeck@suse.de>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
  • Loading branch information
thardeck authored and Anthony Liguori committed Jan 21, 2013
1 parent 7536ee4 commit 6fd8e79
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 3 deletions.
11 changes: 8 additions & 3 deletions ui/vnc.c
Expand Up @@ -1053,20 +1053,24 @@ void vnc_disconnect_finish(VncState *vs)
audio_del(vs);
vnc_release_modifiers(vs);

QTAILQ_REMOVE(&vs->vd->clients, vs, next);
if (vs->initialized) {
QTAILQ_REMOVE(&vs->vd->clients, vs, next);
qemu_remove_mouse_mode_change_notifier(&vs->mouse_mode_notifier);
}

if (QTAILQ_EMPTY(&vs->vd->clients)) {
dcl->idle = 1;
}

qemu_remove_mouse_mode_change_notifier(&vs->mouse_mode_notifier);
vnc_remove_timer(vs->vd);
if (vs->vd->lock_key_sync)
qemu_remove_led_event_handler(vs->led);
vnc_unlock_output(vs);

qemu_mutex_destroy(&vs->output_mutex);
qemu_bh_delete(vs->bh);
if (vs->bh != NULL) {
qemu_bh_delete(vs->bh);
}
buffer_free(&vs->jobs_buffer);

for (i = 0; i < VNC_STAT_ROWS; ++i) {
Expand Down Expand Up @@ -2749,6 +2753,7 @@ static void vnc_connect(VncDisplay *vd, int csock, int skipauth, bool websocket)

void vnc_init_state(VncState *vs)
{
vs->initialized = true;
VncDisplay *vd = vs->vd;

vs->ds = vd->ds;
Expand Down
1 change: 1 addition & 0 deletions ui/vnc.h
Expand Up @@ -306,6 +306,7 @@ struct VncState
QEMUPutLEDEntry *led;

bool abort;
bool initialized;
QemuMutex output_mutex;
QEMUBH *bh;
Buffer jobs_buffer;
Expand Down

0 comments on commit 6fd8e79

Please sign in to comment.