As _stop_event is not mandatory, we are initializing the events array with something that might be NULL. The problem is with the following patch as I'm introducing a new non mandatory event. So this patch makes explicit if we are setting or receiving a _stop_event or not. --- vdagent/vdagent.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/vdagent/vdagent.cpp b/vdagent/vdagent.cpp index 959881d..45ff55d 100644 --- a/vdagent/vdagent.cpp +++ b/vdagent/vdagent.cpp @@ -480,11 +480,17 @@ void VDAgent::input_desktop_message_loop() void VDAgent::event_dispatcher(DWORD timeout, DWORD wake_mask) { - HANDLE events[] = {_control_event, _stop_event}; - DWORD event_count = _stop_event ? 2 : 1; + HANDLE events[2]; + DWORD event_count = 1; DWORD wait_ret; MSG msg; + events[0] = _control_event; + if (_stop_event) { + events[event_count] = _stop_event; + event_count++; + } + wait_ret = MsgWaitForMultipleObjectsEx(event_count, events, timeout, wake_mask, MWMO_ALERTABLE); if (wait_ret == WAIT_OBJECT_0 + event_count) { while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { @@ -498,8 +504,13 @@ void VDAgent::event_dispatcher(DWORD timeout, DWORD wake_mask) handle_control_event(); break; case WAIT_OBJECT_0 + 1: - _running = false; - break; + /* As _stop_event is not mandatory, the wait_ret index might refer to a + * different event, we should explicit check it */ + if (_stop_event) { + vd_printf("%s: received stop event", __func__); + _running = false; + break; + } case WAIT_IO_COMPLETION: case WAIT_TIMEOUT: break; -- 2.7.4 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel