Skip to content

Commit 6147c2e

Browse files
committed
usbdmx: Fix use after free hazard in AsyncUsb* destructor
1 parent f7c0f4f commit 6147c2e

12 files changed

+20
-12
lines changed

plugins/usbdmx/AVLdiyD512.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@ class AVLdiyAsyncUsbSender : public AsyncUsbSender {
124124
}
125125

126126
~AVLdiyAsyncUsbSender() {
127-
CancelTransfer();
128127
delete[] m_control_setup_buffer;
129128
}
130129

plugins/usbdmx/AnymauDMX.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@ class AnymaAsyncUsbSender : public AsyncUsbSender {
124124
}
125125

126126
~AnymaAsyncUsbSender() {
127-
CancelTransfer();
128127
delete[] m_control_setup_buffer;
129128
}
130129

plugins/usbdmx/AsyncUsbReceiver.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ AsyncUsbReceiver::AsyncUsbReceiver(ola::usb::LibUsbAdaptor *adaptor,
3636
}
3737

3838
AsyncUsbReceiver::~AsyncUsbReceiver() {
39+
ola::thread::MutexLocker locker(&m_mutex);
40+
CancelTransfer();
3941
if (!m_inited_with_handle) {
4042
m_adaptor->Close(m_usb_handle);
4143
}

plugins/usbdmx/AsyncUsbSender.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ AsyncUsbSender::AsyncUsbSender(LibUsbAdaptor *adaptor,
3737
}
3838

3939
AsyncUsbSender::~AsyncUsbSender() {
40+
ola::thread::MutexLocker locker(&m_mutex);
41+
CancelTransfer();
4042
m_adaptor->Close(m_usb_handle);
4143
}
4244

plugins/usbdmx/AsyncUsbTransceiverBase.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,13 @@ void AsyncUsbTransceiverBase::TransferCompleteInternal(
6363
}
6464

6565
TransferComplete(transfer);
66+
67+
{
68+
ola::thread::MutexLocker locker(&m_mutex);
69+
if (m_inflight.empty()) {
70+
m_cond.Signal();
71+
}
72+
}
6673
}
6774

6875
AsyncUsbTransceiverBase::AsyncUsbTransceiverBase(LibUsbAdaptor *adaptor,
@@ -82,8 +89,6 @@ AsyncUsbTransceiverBase::AsyncUsbTransceiverBase(LibUsbAdaptor *adaptor,
8289
AsyncUsbTransceiverBase::~AsyncUsbTransceiverBase() {
8390
ola::thread::MutexLocker locker(&m_mutex);
8491

85-
CancelTransfer();
86-
8792
m_adaptor->UnrefDevice(m_usb_device);
8893

8994
while (!m_idle.empty()) {
@@ -121,6 +126,13 @@ void AsyncUsbTransceiverBase::CancelTransfer() {
121126
<< m_adaptor->ErrorCodeToString(ret);
122127
}
123128
}
129+
130+
while (!m_inflight.empty()) {
131+
/* Wait for cancelled transfers to complete. Not waiting for the
132+
* callbacks to happen is undefined behaviour according to libusb
133+
* docs. */
134+
m_cond.Wait(&m_mutex);
135+
}
124136
}
125137

126138
struct libusb_transfer *AsyncUsbTransceiverBase::CurrentTransfer() {

plugins/usbdmx/AsyncUsbTransceiverBase.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class AsyncUsbTransceiverBase {
101101
virtual void PostTransferHook() {}
102102

103103
/**
104-
* @brief Cancel any pending transfers.
104+
* @brief Cancel any pending transfers and wait for them to complete.
105105
*/
106106
void CancelTransfer();
107107

@@ -139,6 +139,7 @@ class AsyncUsbTransceiverBase {
139139
std::queue<struct libusb_transfer*> m_idle; // GUARDED_BY(m_mutex);
140140

141141
ola::thread::Mutex m_mutex;
142+
ola::thread::ConditionVariable m_cond;
142143

143144
private:
144145
/**

plugins/usbdmx/DMXCProjectsNodleU1.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,6 @@ class DMXCProjectsNodleU1AsyncUsbReceiver : public AsyncUsbReceiver {
338338
}
339339

340340
~DMXCProjectsNodleU1AsyncUsbReceiver() {
341-
CancelTransfer();
342341
}
343342

344343
libusb_device_handle* SetupHandle() {
@@ -393,7 +392,6 @@ class DMXCProjectsNodleU1AsyncUsbSender : public AsyncUsbSender {
393392
}
394393

395394
~DMXCProjectsNodleU1AsyncUsbSender() {
396-
CancelTransfer();
397395
}
398396

399397
libusb_device_handle* SetupHandle() {

plugins/usbdmx/DMXCreator512Basic.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,6 @@ class DMXCreator512BasicAsyncUsbSender : public AsyncUsbSender {
193193
}
194194

195195
~DMXCreator512BasicAsyncUsbSender() {
196-
CancelTransfer();
197196
}
198197

199198
libusb_device_handle* SetupHandle() {

plugins/usbdmx/EurolitePro.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,6 @@ class EuroliteProAsyncUsbSender : public AsyncUsbSender {
224224
}
225225

226226
~EuroliteProAsyncUsbSender() {
227-
CancelTransfer();
228227
}
229228

230229
libusb_device_handle* SetupHandle() {

plugins/usbdmx/ShowJockeyDMXU1.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,6 @@ class ShowJockeyDMXU1AsyncUsbSender : public AsyncUsbSender {
277277
}
278278

279279
~ShowJockeyDMXU1AsyncUsbSender() {
280-
CancelTransfer();
281280
delete[] m_tx_frame;
282281
}
283282

0 commit comments

Comments
 (0)