Author: cgutman Date: Sun Dec 4 08:25:35 2011 New Revision: 54579
URL: http://svn.reactos.org/svn/reactos?rev=54579&view=rev Log: [NTOSKRNL] - Release the address space lock before entering SEH because an exception would result in recursive acquisition of the address space lock when the fault handler tries to grab it
Modified: trunk/reactos/ntoskrnl/mm/anonmem.c
Modified: trunk/reactos/ntoskrnl/mm/anonmem.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/anonmem.c?rev=5... ============================================================================== --- trunk/reactos/ntoskrnl/mm/anonmem.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/mm/anonmem.c [iso-8859-1] Sun Dec 4 08:25:35 2011 @@ -1004,8 +1004,8 @@ NTSTATUS Status; PEPROCESS Process; PMMSUPPORT AddressSpace; - PVOID BaseAddress, PBaseAddress; - SIZE_T RegionSize, PRegionSize; + PVOID BaseAddress = NULL, PBaseAddress; + SIZE_T RegionSize = 0, PRegionSize; PEPROCESS CurrentProcess = PsGetCurrentProcess(); KPROCESSOR_MODE PreviousMode = KeGetPreviousMode(); KAPC_STATE ApcState; @@ -1183,22 +1183,26 @@ goto unlock_deref_and_return; }
- /* Enter SEH */ - _SEH2_TRY - { - /* Copy rounded values back in success case */ - *UBaseAddress = BaseAddress; - *URegionSize = RegionSize; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - DPRINT1("Failed to copy values back! (Status: 0x%x)\n", Status); - } - _SEH2_END; - unlock_deref_and_return: MmUnlockAddressSpace(AddressSpace); + + /* Copy rounded values back in success case */ + if (NT_SUCCESS(Status)) + { + /* Enter SEH */ + _SEH2_TRY + { + *UBaseAddress = BaseAddress; + *URegionSize = RegionSize; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + DPRINT1("Failed to copy values back! (Status: 0x%x)\n", Status); + } + _SEH2_END; + } + if (Attached) KeUnstackDetachProcess(&ApcState); if (ProcessHandle != NtCurrentProcess()) ObDereferenceObject(Process);