On 28/09/2015 11:01, sginsb...@svn.reactos.org wrote:
> Author: sginsberg
> Date: Mon Sep 28 09:01:11 2015
> New Revision: 69393
> 
> URL: http://svn.reactos.org/svn/reactos?rev=69393&view=rev
> Log:
> [NTOS] Fix the Ob wait system calls to only catch the exceptions that are 
> expected to be raised by the Ke wait functions (and not potentially silently 
> catching *any* exception and corrupting everything in the process). Also 
> fixup some code logic. SEH Mega Fixup 1/???
> 
> Modified:
>     trunk/reactos/ntoskrnl/ob/obwait.c
> 
> Modified: trunk/reactos/ntoskrnl/ob/obwait.c
> URL: 
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ob/obwait.c?rev=69393&r1=69392&r2=69393&view=diff
> ==============================================================================
> --- trunk/reactos/ntoskrnl/ob/obwait.c        [iso-8859-1] (original)
> +++ trunk/reactos/ntoskrnl/ob/obwait.c        [iso-8859-1] Mon Sep 28 
> 09:01:11 2015
> @@ -49,12 +49,12 @@
>                           IN BOOLEAN Alertable,
>                           IN PLARGE_INTEGER TimeOut OPTIONAL)
>  {
> -    PKWAIT_BLOCK WaitBlockArray = NULL;
> +    PKWAIT_BLOCK WaitBlockArray;
>      HANDLE Handles[MAXIMUM_WAIT_OBJECTS], KernelHandle;
>      PVOID Objects[MAXIMUM_WAIT_OBJECTS];
>      PVOID WaitObjects[MAXIMUM_WAIT_OBJECTS];
> -    ULONG i = 0, ReferencedObjects = 0, j;
> -    KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
> +    ULONG i, ReferencedObjects, j;
> +    KPROCESSOR_MODE PreviousMode;
>      LARGE_INTEGER SafeTimeOut;
>      BOOLEAN LockInUse;
>      PHANDLE_TABLE_ENTRY HandleEntry;
> @@ -65,31 +65,26 @@
>      NTSTATUS Status;
>      PAGED_CODE();
>  
> -    /* Enter a critical region since we'll play with handles */
> -    LockInUse = TRUE;
> -    KeEnterCriticalRegion();
> -
>      /* Check for valid Object Count */
>      if ((ObjectCount > MAXIMUM_WAIT_OBJECTS) || !(ObjectCount))
>      {
>          /* Fail */
> -        Status = STATUS_INVALID_PARAMETER_1;
> -        goto Quickie;
> +        return STATUS_INVALID_PARAMETER_1;
>      }
>  
>      /* Check for valid Wait Type */
>      if ((WaitType != WaitAll) && (WaitType != WaitAny))
>      {
>          /* Fail */
> -        Status = STATUS_INVALID_PARAMETER_3;
> -        goto Quickie;
> -    }
> -
> -    /* Enter SEH */
> -    _SEH2_TRY
> -    {
> -        /* Check if the call came from user mode */
> -        if (PreviousMode != KernelMode)
> +        return STATUS_INVALID_PARAMETER_3;
> +    }
> +
> +    /* Enter SEH for user mode */
> +    PreviousMode = ExGetPreviousMode();
> +    if (PreviousMode != KernelMode)
> +    {
> +        /* Enter SEH */
> +        _SEH2_TRY

No, this is plain wrong.
This is not because you're in kernel mode that the world is marvelous
and callers trustable.
A caller can pass you buggy address and you HAVE to wrap the
RtlCopyMemory in SEH to make sure that if a buggy address is passed, the
whole system isn't brought down (that's the whole purpose of the copy
after all!).

In case you have a doubt, just put some random:
Status = ZwWaitForMultipleObjects(2, (void **)0x42424242, WaitAll,
FALSE, NULL);
In a kernel component. In w2k3, you'll get Status = STATUS_ACCESS_VIOLATION
In ReactOS, with your changes: BSOD.

Please before doing random changes that you believe are right: do testing.
Alex already told you that.

Cheers,
-- 
Pierre Schweitzer <pierre at reactos.org>
System & Network Administrator
Senior Kernel Developer
ReactOS Deutschland e.V.

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

_______________________________________________
Ros-dev mailing list
Ros-dev@reactos.org
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to