RtlEqualUnicodeString is in a pagable code section in ntoskrnl,
RtlCompareMemory is not. Holding a spinlock means we're at
DISPATCH_LEVEL and can't access pagable code/data.


On 2014-10-16 19:32, Hermès BÉLUSCA - MAÏTO wrote:
> What is the *root* reason for this problem (ok I’ve seen in the comment,
> “paged code” and “holding spin lock”, but it doesn’t answer my question)?
> Because I’ve looked at our code of RtlEqualUnicodeString and I see that it
> just calls RtlCompareUnicodeString that in turns just loops over the two
> memory buffers, checks their contents (and in case we check for char case,
> calls RtlUpcaseUnicodeChar). And RtlCompareMemory does that, too? What I’m
> missing?
> 
> Hermès.
> 
> 
> -------------------------------------------------------------------------
> Author: tfaber
> Date: Thu Oct 16 16:40:13 2014
> New Revision: 64762
> 
> URL: http://svn.reactos.org/svn/reactos?rev=64762&view=rev
> Log:
> [NPFS]
> - Don't call RtlEqualUnicodeString (paged code) while holding a spin lock.
> Powered by Driver Verifier.
> 
> Modified:
>     trunk/reactos/drivers/filesystems/npfs/waitsup.c
> 
> Modified: trunk/reactos/drivers/filesystems/npfs/waitsup.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/npfs/wa
> itsup.c?rev=64762&r1=64761&r2=64762&view=diff
> ============================================================================
> ==
> --- trunk/reactos/drivers/filesystems/npfs/waitsup.c  [iso-8859-1]
> (original)
> +++ trunk/reactos/drivers/filesystems/npfs/waitsup.c  [iso-8859-1] Thu Oct
> 16 16:40:13 2014
> @@ -97,6 +97,22 @@
>  {
>      InitializeListHead(&WaitQueue->WaitList);
>      KeInitializeSpinLock(&WaitQueue->WaitLock);
> +}
> +
> +static
> +BOOLEAN
> +NpEqualUnicodeString(IN PCUNICODE_STRING String1,
> +                     IN PCUNICODE_STRING String2)
> +{
> +    SIZE_T EqualLength;
> +
> +    if (String1->Length != String2->Length)
> +        return FALSE;
> +
> +    EqualLength = RtlCompareMemory(String1->Buffer,
> +                                   String2->Buffer,
> +                                   String1->Length);
> +    return EqualLength == String1->Length;
>  }
>  
>  NTSTATUS
> @@ -156,7 +172,8 @@
>              PipeName.MaximumLength = PipeName.Length;
>          }
>  
> -        if (RtlEqualUnicodeString(&WaitName, &PipeName, FALSE))
> +        /* Can't use RtlEqualUnicodeString with a spinlock held */
> +        if (NpEqualUnicodeString(&WaitName, &PipeName))
>          {
>              /* Found a matching wait. Cancel it */
>              RemoveEntryList(&WaitIrp->Tail.Overlay.ListEntry);
> 


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

Reply via email to