From 578e26c0d3e7fe4ed03bfcf3bd336a26aff8c767 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Mon, 2 Feb 2015 08:53:19 +0100 Subject: [PATCH] usb_midi: fix KDL when there is no in or out endpoint usb_midi devices can be input-only or output-only. We failed to check for this in some places leading to KDL on devices that are not bidirectional. Should fix #11810. --- .../kernel/drivers/midi/usb_midi/usb_midi.cpp | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/add-ons/kernel/drivers/midi/usb_midi/usb_midi.cpp b/src/add-ons/kernel/drivers/midi/usb_midi/usb_midi.cpp index 3facd1ae57..589905ef93 100644 --- a/src/add-ons/kernel/drivers/midi/usb_midi/usb_midi.cpp +++ b/src/add-ons/kernel/drivers/midi/usb_midi/usb_midi.cpp @@ -431,13 +431,15 @@ got_one: } /* issue bulk transfer */ - DPRINTF_DEBUG((MY_ID "queueing bulk xfer IN endpoint\n")); - status = usb->queue_bulk(midiDevice->ept_in->handle, midiDevice->buffer, - midiDevice->inMaxPkt, - (usb_callback_func)midi_usb_read_callback, midiDevice); - if (status != B_OK) { - DPRINTF_ERR((MY_ID "queue_bulk() error 0x%" B_PRIx32 "\n", status)); - return B_ERROR; + if (midiDevice->ept_in != NULL) { + DPRINTF_DEBUG((MY_ID "queueing bulk xfer IN endpoint\n")); + status = usb->queue_bulk(midiDevice->ept_in->handle, midiDevice->buffer, + midiDevice->inMaxPkt, + (usb_callback_func)midi_usb_read_callback, midiDevice); + if (status != B_OK) { + DPRINTF_ERR((MY_ID "queue_bulk() error 0x%" B_PRIx32 "\n", status)); + return B_ERROR; + } } *cookie = midiDevice; @@ -471,8 +473,11 @@ usb_midi_removed(void* cookie) } remove_port(port); } - usb->cancel_queued_transfers(midiDevice->ept_in->handle); - usb->cancel_queued_transfers(midiDevice->ept_out->handle); + + if (midiDevice->ept_in != NULL) + usb->cancel_queued_transfers(midiDevice->ept_in->handle); + if (midiDevice->ept_out != NULL) + usb->cancel_queued_transfers(midiDevice->ept_out->handle); DPRINTF_DEBUG((MY_ID "usb_midi_removed: doing remove: %s\n", midiDevice->name)); remove_device(midiDevice);