[KERNEL32] Ensure the PebLock is always released in FlsFree

This commit is contained in:
Mark Jansen 2018-05-11 22:23:52 +02:00
parent b6e3cf3c03
commit 12654d2852
No known key found for this signature in database
GPG key ID: B39240EE84BEAE8B

View file

@ -1,12 +1,12 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS System Libraries
* FILE: dll/win32/kernel32/client/fiber.c
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
* PURPOSE: Fiber Implementation
* PROGRAMMERS:
* Alex Ionescu (alex@relsoft.net)
* KJK::Hyperion <noog@libero.it>
* COPYRIGHT: Copyright 2005-2011 Alex Ionescu (alex@relsoft.net)
* Copyright 2003-2008 KJK::Hyperion (noog@libero.it)
* Copyright 2018 Mark Jansen (mark.jansen@reactos.org)
*/
#include <k32.h>
#include <ndk/rtltypes.h>
@ -410,6 +410,8 @@ FlsFree(DWORD dwFlsIndex)
RtlAcquirePebLock();
_SEH2_TRY
{
ret = RtlAreBitsSet(Peb->FlsBitmap, dwFlsIndex, 1);
if (ret)
{
@ -418,7 +420,6 @@ FlsFree(DWORD dwFlsIndex)
RtlClearBits(Peb->FlsBitmap, dwFlsIndex, 1);
lpCallback = Peb->FlsCallback[dwFlsIndex];
Peb->FlsCallback[dwFlsIndex] = NULL;
for (Entry = Peb->FlsListHead.Flink; Entry != &Peb->FlsListHead; Entry = Entry->Flink)
{
@ -434,12 +435,19 @@ FlsFree(DWORD dwFlsIndex)
pFlsData->Data[dwFlsIndex] = NULL;
}
}
Peb->FlsCallback[dwFlsIndex] = NULL;
}
else
{
SetLastError(ERROR_INVALID_PARAMETER);
}
}
_SEH2_FINALLY
{
RtlReleasePebLock();
}
_SEH2_END;
return ret;
}