Author: ion Date: Sat Jul 23 11:46:57 2011 New Revision: 52803
URL: http://svn.reactos.org/svn/reactos?rev=52803&view=rev Log: [KERNEL32] Bug #43: ConvertFiberToThread should return ERROR_ALREADY_THREAD, not ERROR_INVALID_PARAMETER in case of failure. Bug #44: ConvertFiberToThread should set FiberData to NULL in the TEB, after doing the conversion. Thanks, Winetests, for saying "0 failures", when this API was broken.
Modified: trunk/reactos/dll/win32/kernel32/client/fiber.c
Modified: trunk/reactos/dll/win32/kernel32/client/fiber.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/client/f... ============================================================================== --- trunk/reactos/dll/win32/kernel32/client/fiber.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/kernel32/client/fiber.c [iso-8859-1] Sat Jul 23 11:46:57 2011 @@ -59,24 +59,27 @@ WINAPI ConvertFiberToThread(VOID) { - PTEB pTeb = NtCurrentTeb(); + PTEB Teb; + PFIBER FiberData; DPRINT1("Converting Fiber to Thread\n");
- /* the current thread isn't running a fiber: failure */ - if (!pTeb->HasFiberData) - { - SetLastError(ERROR_INVALID_PARAMETER); + /* Check if the thread is already not a fiber */ + Teb = NtCurrentTeb(); + if (!Teb->HasFiberData) + { + /* Fail */ + SetLastError(ERROR_ALREADY_THREAD); return FALSE; }
/* this thread won't run a fiber anymore */ - pTeb->HasFiberData = FALSE; - - /* free the fiber */ - if(pTeb->NtTib.FiberData != NULL) - { - RtlFreeHeap(GetProcessHeap(), 0, pTeb->NtTib.FiberData); - } + Teb->HasFiberData = FALSE; + FiberData = Teb->NtTib.FiberData; + Teb->NtTib.FiberData = NULL; + + /* Free the fiber */ + ASSERT(FiberData != NULL); + RtlFreeHeap(GetProcessHeap(), 0, FiberData);
/* success */ return TRUE;