From af3c238ce151b268556838f9e2a1924eaa6108d5 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Tue, 28 Feb 2017 17:36:48 +0100 Subject: [PATCH] vbox: avoid null access in input handling that happened during early bootup. The signal about input events may arrive before keyboard and mouse is set (due wait_and_dispatch_one_signal called from a started pthread and ep still not done with the initialisation) Issue #2306 --- repos/ports/src/virtualbox/frontend/console.cc | 12 +++++++++--- repos/ports/src/virtualbox5/frontend/console.cc | 12 +++++++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/repos/ports/src/virtualbox/frontend/console.cc b/repos/ports/src/virtualbox/frontend/console.cc index 244b8ea590..7fdc813578 100644 --- a/repos/ports/src/virtualbox/frontend/console.cc +++ b/repos/ports/src/virtualbox/frontend/console.cc @@ -186,11 +186,17 @@ void GenodeConsole::handle_input() /* read out input capabilities of guest */ bool guest_abs = false, guest_rel = false, guest_multi = false; - _vbox_mouse->COMGETTER(AbsoluteSupported)(&guest_abs); - _vbox_mouse->COMGETTER(RelativeSupported)(&guest_rel); - _vbox_mouse->COMGETTER(MultiTouchSupported)(&guest_multi); + if (_vbox_mouse) { + _vbox_mouse->COMGETTER(AbsoluteSupported)(&guest_abs); + _vbox_mouse->COMGETTER(RelativeSupported)(&guest_rel); + _vbox_mouse->COMGETTER(MultiTouchSupported)(&guest_multi); + } _input.for_each_event([&] (Input::Event const &ev) { + /* if keyboard/mouse not available, consume input events and drop it */ + if (!_vbox_keyboard || !_vbox_mouse) + return; + bool const press = ev.type() == Input::Event::PRESS; bool const release = ev.type() == Input::Event::RELEASE; bool const key = press || release; diff --git a/repos/ports/src/virtualbox5/frontend/console.cc b/repos/ports/src/virtualbox5/frontend/console.cc index e7c9322fae..215572b488 100644 --- a/repos/ports/src/virtualbox5/frontend/console.cc +++ b/repos/ports/src/virtualbox5/frontend/console.cc @@ -131,11 +131,17 @@ void GenodeConsole::handle_input() /* read out input capabilities of guest */ bool guest_abs = false, guest_rel = false, guest_multi = false; - _vbox_mouse->COMGETTER(AbsoluteSupported)(&guest_abs); - _vbox_mouse->COMGETTER(RelativeSupported)(&guest_rel); - _vbox_mouse->COMGETTER(MultiTouchSupported)(&guest_multi); + if (_vbox_mouse) { + _vbox_mouse->COMGETTER(AbsoluteSupported)(&guest_abs); + _vbox_mouse->COMGETTER(RelativeSupported)(&guest_rel); + _vbox_mouse->COMGETTER(MultiTouchSupported)(&guest_multi); + } _input.for_each_event([&] (Input::Event const &ev) { + /* if keyboard/mouse not available, consume input events and drop it */ + if (!_vbox_keyboard || !_vbox_mouse) + return; + bool const press = ev.type() == Input::Event::PRESS; bool const release = ev.type() == Input::Event::RELEASE; bool const key = press || release;