mirror of https://github.com/xemu-project/xemu.git
un-register kbd driver in case of USB kbd unplug.
If a USB keyboard is unplugged, the keyboard eventhandler is never removed, and events will continue to be passed through to the device, causing crashes or memory corruption. Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
55541c8afc
commit
46aaebff40
|
@ -42,6 +42,7 @@ typedef struct QEMUPutLEDEntry {
|
||||||
} QEMUPutLEDEntry;
|
} QEMUPutLEDEntry;
|
||||||
|
|
||||||
void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque);
|
void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque);
|
||||||
|
void qemu_remove_kbd_event_handler(void);
|
||||||
QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
|
QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
|
||||||
void *opaque, int absolute,
|
void *opaque, int absolute,
|
||||||
const char *name);
|
const char *name);
|
||||||
|
|
|
@ -855,9 +855,13 @@ static void usb_hid_handle_destroy(USBDevice *dev)
|
||||||
{
|
{
|
||||||
USBHIDState *s = (USBHIDState *)dev;
|
USBHIDState *s = (USBHIDState *)dev;
|
||||||
|
|
||||||
if (s->kind != USB_KEYBOARD)
|
switch(s->kind) {
|
||||||
|
case USB_KEYBOARD:
|
||||||
|
qemu_remove_kbd_event_handler();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
qemu_remove_mouse_event_handler(s->ptr.eh_entry);
|
qemu_remove_mouse_event_handler(s->ptr.eh_entry);
|
||||||
/* TODO: else */
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usb_hid_initfn(USBDevice *dev, int kind)
|
static int usb_hid_initfn(USBDevice *dev, int kind)
|
||||||
|
|
6
input.c
6
input.c
|
@ -42,6 +42,12 @@ void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
|
||||||
qemu_put_kbd_event = func;
|
qemu_put_kbd_event = func;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qemu_remove_kbd_event_handler(void)
|
||||||
|
{
|
||||||
|
qemu_put_kbd_event_opaque = NULL;
|
||||||
|
qemu_put_kbd_event = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void check_mode_change(void)
|
static void check_mode_change(void)
|
||||||
{
|
{
|
||||||
static int current_is_absolute, current_has_absolute;
|
static int current_is_absolute, current_has_absolute;
|
||||||
|
|
Loading…
Reference in New Issue