Implement resource cleanup for failed allocations during idle thread setup
This commit is contained in:
@@ -82,7 +82,8 @@ KE::KProcess::InitializeIdleProcess(IN OUT PKPROCESS Process,
|
||||
Status = MM::Allocator::AllocatePool(NonPagedPool, MapSize, (PVOID*)&Process->ActiveProcessors);
|
||||
if(Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failed, return the status code */
|
||||
/* Memory allocation failed, free previously allocated memory and return the status code */
|
||||
MM::Allocator::FreePool((PVOID)Process->Affinity);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
@@ -75,7 +75,8 @@ KE::KThread::InitializeIdleThread(IN PKPROCESS IdleProcess,
|
||||
Status = MM::Allocator::AllocatePool(NonPagedPool, MapSize, (PVOID*)&IdleThread->UserAffinity);
|
||||
if(Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failed, return the status code */
|
||||
/* Memory allocation failed, free previously allocated memory and return the status code */
|
||||
MM::Allocator::FreePool((PVOID)IdleThread->Affinity);
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -88,7 +89,9 @@ KE::KThread::InitializeIdleThread(IN PKPROCESS IdleProcess,
|
||||
NULLPTR, NULLPTR, Stack, TRUE);
|
||||
if(Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* Failed to initialize IDLE thread, return status code */
|
||||
/* Failed to initialize IDLE thread, free both affinity maps and return the status code */
|
||||
MM::Allocator::FreePool((PVOID)IdleThread->Affinity);
|
||||
MM::Allocator::FreePool((PVOID)IdleThread->UserAffinity);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
@@ -50,5 +50,14 @@ PS::Thread::CreateIdleThread(IN PKPROCESSOR_CONTROL_BLOCK Prcb,
|
||||
Prcb->IdleThread = &IdleThread->ThreadControlBlock;
|
||||
|
||||
/* Initialize the IDLE thread */
|
||||
return KE::KThread::InitializeIdleThread(IdleProcess, &IdleThread->ThreadControlBlock, Prcb, Stack);
|
||||
Status = KE::KThread::InitializeIdleThread(IdleProcess, &IdleThread->ThreadControlBlock, Prcb, Stack);
|
||||
if(Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* Failed to initialize the IDLE thread state, free the ETHREAD object and return the status code */
|
||||
MM::Allocator::FreePool((PVOID)IdleThread);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Return success */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user