Initialize the isochronous lock earlier.
The constructor may abort at various places and the destructor cleans up everything already initialized. The mutex was however not initialized early on, leading to #8153 where the mutex was destroied in the error case, accessing uninitialized memory. Fixes #8153 though the reason for the aborted constructor probably needs to be investigated as well.
This commit is contained in:
@@ -399,6 +399,9 @@ UHCI::UHCI(pci_info *info, Stack *stack)
|
|||||||
fRootHubAddress(0),
|
fRootHubAddress(0),
|
||||||
fPortResetChange(0)
|
fPortResetChange(0)
|
||||||
{
|
{
|
||||||
|
// Create a lock for the isochronous transfer list
|
||||||
|
mutex_init(&fIsochronousLock, "UHCI isochronous lock");
|
||||||
|
|
||||||
if (!fInitOK) {
|
if (!fInitOK) {
|
||||||
TRACE_ERROR("bus manager failed to init\n");
|
TRACE_ERROR("bus manager failed to init\n");
|
||||||
return;
|
return;
|
||||||
@@ -533,9 +536,6 @@ UHCI::UHCI(pci_info *info, Stack *stack)
|
|||||||
"uhci cleanup thread", B_NORMAL_PRIORITY, (void *)this);
|
"uhci cleanup thread", B_NORMAL_PRIORITY, (void *)this);
|
||||||
resume_thread(fCleanupThread);
|
resume_thread(fCleanupThread);
|
||||||
|
|
||||||
// Create a lock for the isochronous transfer list
|
|
||||||
mutex_init(&fIsochronousLock, "UHCI isochronous lock");
|
|
||||||
|
|
||||||
// Create semaphore the isochronous finisher thread will wait for
|
// Create semaphore the isochronous finisher thread will wait for
|
||||||
fFinishIsochronousTransfersSem = create_sem(0,
|
fFinishIsochronousTransfersSem = create_sem(0,
|
||||||
"UHCI Isochronous Finish Transfers");
|
"UHCI Isochronous Finish Transfers");
|
||||||
|
|||||||
Reference in New Issue
Block a user