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);
|
Status = MM::Allocator::AllocatePool(NonPagedPool, MapSize, (PVOID*)&Process->ActiveProcessors);
|
||||||
if(Status != STATUS_SUCCESS)
|
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;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,8 @@ KE::KThread::InitializeIdleThread(IN PKPROCESS IdleProcess,
|
|||||||
Status = MM::Allocator::AllocatePool(NonPagedPool, MapSize, (PVOID*)&IdleThread->UserAffinity);
|
Status = MM::Allocator::AllocatePool(NonPagedPool, MapSize, (PVOID*)&IdleThread->UserAffinity);
|
||||||
if(Status != STATUS_SUCCESS)
|
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;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,7 +89,9 @@ KE::KThread::InitializeIdleThread(IN PKPROCESS IdleProcess,
|
|||||||
NULLPTR, NULLPTR, Stack, TRUE);
|
NULLPTR, NULLPTR, Stack, TRUE);
|
||||||
if(Status != STATUS_SUCCESS)
|
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;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,5 +50,14 @@ PS::Thread::CreateIdleThread(IN PKPROCESSOR_CONTROL_BLOCK Prcb,
|
|||||||
Prcb->IdleThread = &IdleThread->ThreadControlBlock;
|
Prcb->IdleThread = &IdleThread->ThreadControlBlock;
|
||||||
|
|
||||||
/* Initialize the IDLE thread */
|
/* 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