Skip to content

Commit 5b3c5c7

Browse files
committed
usbdmx: Fix use after free hazard in AsyncUsb* destructor
1 parent 67d1737 commit 5b3c5c7

12 files changed

+19
-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: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ 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+
}
6672
}
6773

6874
AsyncUsbTransceiverBase::AsyncUsbTransceiverBase(LibUsbAdaptor *adaptor,
@@ -82,8 +88,6 @@ AsyncUsbTransceiverBase::AsyncUsbTransceiverBase(LibUsbAdaptor *adaptor,
8288
AsyncUsbTransceiverBase::~AsyncUsbTransceiverBase() {
8389
ola::thread::MutexLocker locker(&m_mutex);
8490

85-
CancelTransfer();
86-
8791
m_adaptor->UnrefDevice(m_usb_device);
8892

8993
while (!m_idle.empty()) {
@@ -118,6 +122,13 @@ void AsyncUsbTransceiverBase::CancelTransfer() {
118122
<< m_adaptor->ErrorCodeToString(ret);
119123
}
120124
}
125+
126+
while (!m_inflight.empty()) {
127+
/* Wait for cancelled transfers to complete. Not waiting for the
128+
* callbacks to happen is undefined behaviour according to libusb
129+
* docs. */
130+
m_cond.Wait(&m_mutex);
131+
}
121132
}
122133

123134
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
@@ -335,7 +335,6 @@ class DMXCProjectsNodleU1AsyncUsbReceiver : public AsyncUsbReceiver {
335335
}
336336

337337
~DMXCProjectsNodleU1AsyncUsbReceiver() {
338-
CancelTransfer();
339338
}
340339

341340
libusb_device_handle* SetupHandle() {
@@ -390,7 +389,6 @@ class DMXCProjectsNodleU1AsyncUsbSender : public AsyncUsbSender {
390389
}
391390

392391
~DMXCProjectsNodleU1AsyncUsbSender() {
393-
CancelTransfer();
394392
}
395393

396394
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)