Good to know we are now changing good, working code, on people's "request".

Best regards,
Alex Ionescu


On Mon, Sep 5, 2011 at 4:05 PM, <[email protected]> wrote:

> Author: fireball
> Date: Mon Sep  5 15:05:56 2011
> New Revision: 53599
>
> URL: http://svn.reactos.org/svn/reactos?rev=53599&view=rev
> Log:
> [NTOS]
> - Fix IoCheckEaBufferValidity (IntEaLength must be signed, otherwise loop
> exiting condition may not trigger).
> - SEH-protect ObQueryNameString (by Dmitry Chapyshev's request).
>
> Modified:
>    trunk/reactos/ntoskrnl/io/iomgr/util.c
>    trunk/reactos/ntoskrnl/ob/obname.c
>
> Modified: trunk/reactos/ntoskrnl/io/iomgr/util.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/util.c?rev=53599&r1=53598&r2=53599&view=diff
>
> ==============================================================================
> --- trunk/reactos/ntoskrnl/io/iomgr/util.c [iso-8859-1] (original)
> +++ trunk/reactos/ntoskrnl/io/iomgr/util.c [iso-8859-1] Mon Sep  5 15:05:56
> 2011
> @@ -166,7 +166,8 @@
>                         OUT PULONG ErrorOffset)
>  {
>     PFILE_FULL_EA_INFORMATION EaBufferEnd;
> -    ULONG NextEaBufferOffset, IntEaLength;
> +    ULONG NextEaBufferOffset;
> +    LONG IntEaLength;
>
>     PAGED_CODE();
>
>
> Modified: trunk/reactos/ntoskrnl/ob/obname.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ob/obname.c?rev=53599&r1=53598&r2=53599&view=diff
>
> ==============================================================================
> --- trunk/reactos/ntoskrnl/ob/obname.c [iso-8859-1] (original)
> +++ trunk/reactos/ntoskrnl/ob/obname.c [iso-8859-1] Mon Sep  5 15:05:56
> 2011
> @@ -986,6 +986,7 @@
>     ULONG NameSize;
>     PWCH ObjectName;
>     BOOLEAN ObjectIsNamed;
> +    NTSTATUS Status = STATUS_SUCCESS;
>
>     /* Get the Kernel Meta-Structures */
>     ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
> @@ -994,28 +995,57 @@
>     /* Check if a Query Name Procedure is available */
>     if (ObjectHeader->Type->TypeInfo.QueryNameProcedure)
>     {
> -        /* Call the procedure */
> +        /* Call the procedure inside SEH */
>         ObjectIsNamed = ((LocalInfo) && (LocalInfo->Name.Length > 0));
> -        return ObjectHeader->Type->TypeInfo.QueryNameProcedure(Object,
> +
> +        _SEH2_TRY
> +        {
> +            Status =
> ObjectHeader->Type->TypeInfo.QueryNameProcedure(Object,
>
>  ObjectIsNamed,
>
>  ObjectNameInfo,
>                                                                Length,
>
>  ReturnLength,
>                                                                KernelMode);
> +        }
> +        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
> +        {
> +            /* Return the exception code */
> +            Status = _SEH2_GetExceptionCode();
> +        }
> +        _SEH2_END;
> +
> +        return Status;
>     }
>
>     /* Check if the object doesn't even have a name */
>     if (!(LocalInfo) || !(LocalInfo->Name.Buffer))
>     {
> -        /* We're returning the name structure */
> -        *ReturnLength = sizeof(OBJECT_NAME_INFORMATION);
> -
> -        /* Check if we were given enough space */
> -        if (*ReturnLength > Length) return STATUS_INFO_LENGTH_MISMATCH;
> -
> -        /* Return an empty buffer */
> -        RtlInitEmptyUnicodeString(&ObjectNameInfo->Name, NULL, 0);
> -        return STATUS_SUCCESS;
> +        Status = STATUS_SUCCESS;
> +
> +        _SEH2_TRY
> +        {
> +            /* We're returning the name structure */
> +            *ReturnLength = sizeof(OBJECT_NAME_INFORMATION);
> +
> +            /* Check if we were given enough space */
> +            if (*ReturnLength > Length)
> +            {
> +                Status = STATUS_INFO_LENGTH_MISMATCH;
> +            }
> +            else
> +            {
> +                /* Return an empty buffer */
> +                RtlInitEmptyUnicodeString(&ObjectNameInfo->Name, NULL, 0);
> +            }
> +        }
> +        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
> +        {
> +            /* Return the exception code */
> +            Status = _SEH2_GetExceptionCode();
> +        }
> +        _SEH2_END;
> +
> +        return Status;
>     }
>
>     /*
> @@ -1025,126 +1055,136 @@
>      * enough right at the beginning, not work our way through
>      * and find out at the end
>      */
> -    if (Object == ObpRootDirectoryObject)
> -    {
> -        /* Size of the '\' string */
> -        NameSize = sizeof(OBJ_NAME_PATH_SEPARATOR);
> -    }
> -    else
> -    {
> -        /* Get the Object Directory and add name of Object */
> -        ParentDirectory = LocalInfo->Directory;
> -        NameSize = sizeof(OBJ_NAME_PATH_SEPARATOR) +
> LocalInfo->Name.Length;
> -
> -        /* Loop inside the directory to get the top-most one (meaning
> root) */
> -        while ((ParentDirectory != ObpRootDirectoryObject) &&
> (ParentDirectory))
> -        {
> -            /* Get the Name Information */
> -            LocalInfo = OBJECT_HEADER_TO_NAME_INFO(
> -                            OBJECT_TO_OBJECT_HEADER(ParentDirectory));
> -
> -            /* Add the size of the Directory Name */
> -            if (LocalInfo && LocalInfo->Directory)
> -            {
> -                /* Size of the '\' string + Directory Name */
> -                NameSize += sizeof(OBJ_NAME_PATH_SEPARATOR) +
> -                            LocalInfo->Name.Length;
> -
> -                /* Move to next parent Directory */
> -                ParentDirectory = LocalInfo->Directory;
> -            }
> -            else
> -            {
> -                /* Directory with no name. We append "...\" */
> -                NameSize += sizeof(L"...") +
> sizeof(OBJ_NAME_PATH_SEPARATOR);
> -                break;
> -            }
> -        }
> -    }
> -
> -    /* Finally, add the name of the structure and the null char */
> -    *ReturnLength = NameSize +
> -                    sizeof(OBJECT_NAME_INFORMATION) +
> -                    sizeof(UNICODE_NULL);
> -
> -    /* Check if we were given enough space */
> -    if (*ReturnLength > Length) return STATUS_INFO_LENGTH_MISMATCH;
> -
> -    /*
> -     * Now we will actually create the name. We work backwards because
> -     * it's easier to start off from the Name we have and walk up the
> -     * parent directories. We use the same logic as Name Length
> calculation.
> -     */
> -    LocalInfo = OBJECT_HEADER_TO_NAME_INFO(ObjectHeader);
> -    ObjectName = (PWCH)((ULONG_PTR)ObjectNameInfo + *ReturnLength);
> -    *--ObjectName = UNICODE_NULL;
> -
> -    /* Check if the object is actually the Root directory */
> -    if (Object == ObpRootDirectoryObject)
> -    {
> -        /* This is already the Root Directory, return "\\" */
> -        *--ObjectName = OBJ_NAME_PATH_SEPARATOR;
> -        ObjectNameInfo->Name.Length = (USHORT)NameSize;
> -        ObjectNameInfo->Name.MaximumLength = (USHORT)(NameSize +
> -
>  sizeof(UNICODE_NULL));
> -        ObjectNameInfo->Name.Buffer = ObjectName;
> -        return STATUS_SUCCESS;
> -    }
> -    else
> -    {
> -        /* Start by adding the Object's Name */
> -        ObjectName = (PWCH)((ULONG_PTR)ObjectName -
> -                            LocalInfo->Name.Length);
> -        RtlCopyMemory(ObjectName,
> -                      LocalInfo->Name.Buffer,
> -                      LocalInfo->Name.Length);
> -
> -        /* Now parse the Parent directories until we reach the top */
> -        ParentDirectory = LocalInfo->Directory;
> -        while ((ParentDirectory != ObpRootDirectoryObject) &&
> (ParentDirectory))
> -        {
> -            /* Get the name information */
> -            LocalInfo = OBJECT_HEADER_TO_NAME_INFO(
> -                            OBJECT_TO_OBJECT_HEADER(ParentDirectory));
> -
> -            /* Add the "\" */
> +    _SEH2_TRY
> +    {
> +        if (Object == ObpRootDirectoryObject)
> +        {
> +            /* Size of the '\' string */
> +            NameSize = sizeof(OBJ_NAME_PATH_SEPARATOR);
> +        }
> +        else
> +        {
> +            /* Get the Object Directory and add name of Object */
> +            ParentDirectory = LocalInfo->Directory;
> +            NameSize = sizeof(OBJ_NAME_PATH_SEPARATOR) +
> LocalInfo->Name.Length;
> +
> +            /* Loop inside the directory to get the top-most one (meaning
> root) */
> +            while ((ParentDirectory != ObpRootDirectoryObject) &&
> (ParentDirectory))
> +            {
> +                /* Get the Name Information */
> +                LocalInfo = OBJECT_HEADER_TO_NAME_INFO(
> +                    OBJECT_TO_OBJECT_HEADER(ParentDirectory));
> +
> +                /* Add the size of the Directory Name */
> +                if (LocalInfo && LocalInfo->Directory)
> +                {
> +                    /* Size of the '\' string + Directory Name */
> +                    NameSize += sizeof(OBJ_NAME_PATH_SEPARATOR) +
> +                                LocalInfo->Name.Length;
> +
> +                    /* Move to next parent Directory */
> +                    ParentDirectory = LocalInfo->Directory;
> +                }
> +                else
> +                {
> +                    /* Directory with no name. We append "...\" */
> +                    NameSize += sizeof(L"...") +
> sizeof(OBJ_NAME_PATH_SEPARATOR);
> +                    break;
> +                }
> +            }
> +        }
> +
> +        /* Finally, add the name of the structure and the null char */
> +        *ReturnLength = NameSize +
> +                        sizeof(OBJECT_NAME_INFORMATION) +
> +                        sizeof(UNICODE_NULL);
> +
> +        /* Check if we were given enough space */
> +        if (*ReturnLength > Length) _SEH2_YIELD(return
> STATUS_INFO_LENGTH_MISMATCH);
> +
> +        /*
> +        * Now we will actually create the name. We work backwards because
> +        * it's easier to start off from the Name we have and walk up the
> +        * parent directories. We use the same logic as Name Length
> calculation.
> +        */
> +        LocalInfo = OBJECT_HEADER_TO_NAME_INFO(ObjectHeader);
> +        ObjectName = (PWCH)((ULONG_PTR)ObjectNameInfo + *ReturnLength);
> +        *--ObjectName = UNICODE_NULL;
> +
> +        /* Check if the object is actually the Root directory */
> +        if (Object == ObpRootDirectoryObject)
> +        {
> +            /* This is already the Root Directory, return "\\" */
> +            *--ObjectName = OBJ_NAME_PATH_SEPARATOR;
> +            ObjectNameInfo->Name.Length = (USHORT)NameSize;
> +            ObjectNameInfo->Name.MaximumLength = (USHORT)(NameSize +
> +
>  sizeof(UNICODE_NULL));
> +            ObjectNameInfo->Name.Buffer = ObjectName;
> +            _SEH2_YIELD(return STATUS_SUCCESS);
> +        }
> +        else
> +        {
> +            /* Start by adding the Object's Name */
> +            ObjectName = (PWCH)((ULONG_PTR)ObjectName -
> +                                           LocalInfo->Name.Length);
> +            RtlCopyMemory(ObjectName,
> +                          LocalInfo->Name.Buffer,
> +                          LocalInfo->Name.Length);
> +
> +            /* Now parse the Parent directories until we reach the top */
> +            ParentDirectory = LocalInfo->Directory;
> +            while ((ParentDirectory != ObpRootDirectoryObject) &&
> (ParentDirectory))
> +            {
> +                /* Get the name information */
> +                LocalInfo = OBJECT_HEADER_TO_NAME_INFO(
> +                    OBJECT_TO_OBJECT_HEADER(ParentDirectory));
> +
> +                /* Add the "\" */
> +                *(--ObjectName) = OBJ_NAME_PATH_SEPARATOR;
> +
> +                /* Add the Parent Directory's Name */
> +                if (LocalInfo && LocalInfo->Name.Buffer)
> +                {
> +                    /* Add the name */
> +                    ObjectName = (PWCH)((ULONG_PTR)ObjectName -
> +
> LocalInfo->Name.Length);
> +                    RtlCopyMemory(ObjectName,
> +                                  LocalInfo->Name.Buffer,
> +                                  LocalInfo->Name.Length);
> +
> +                    /* Move to next parent */
> +                    ParentDirectory = LocalInfo->Directory;
> +                }
> +                else
> +                {
> +                    /* Directory without a name, we add "..." */
> +                    ObjectName = (PWCH)((ULONG_PTR)ObjectName -
> +                                                   sizeof(L"...") +
> +                                                   sizeof(UNICODE_NULL));
> +                    RtlCopyMemory(ObjectName,
> +                                  L"...",
> +                                  sizeof(L"...") + sizeof(UNICODE_NULL));
> +                    break;
> +                }
> +            }
> +
> +            /* Add Root Directory Name */
>             *(--ObjectName) = OBJ_NAME_PATH_SEPARATOR;
> -
> -            /* Add the Parent Directory's Name */
> -            if (LocalInfo && LocalInfo->Name.Buffer)
> -            {
> -                /* Add the name */
> -                ObjectName = (PWCH)((ULONG_PTR)ObjectName -
> -                                    LocalInfo->Name.Length);
> -                RtlCopyMemory(ObjectName,
> -                              LocalInfo->Name.Buffer,
> -                              LocalInfo->Name.Length);
> -
> -                /* Move to next parent */
> -                ParentDirectory = LocalInfo->Directory;
> -            }
> -            else
> -            {
> -                /* Directory without a name, we add "..." */
> -                ObjectName = (PWCH)((ULONG_PTR)ObjectName -
> -                                     sizeof(L"...") +
> sizeof(UNICODE_NULL));
> -                RtlCopyMemory(ObjectName,
> -                              L"...",
> -                              sizeof(L"...") + sizeof(UNICODE_NULL));
> -                break;
> -            }
> -        }
> -
> -        /* Add Root Directory Name */
> -        *(--ObjectName) = OBJ_NAME_PATH_SEPARATOR;
> -        ObjectNameInfo->Name.Length = (USHORT)NameSize;
> -        ObjectNameInfo->Name.MaximumLength = (USHORT)(NameSize +
> -
>  sizeof(UNICODE_NULL));
> -        ObjectNameInfo->Name.Buffer = ObjectName;
> -    }
> +            ObjectNameInfo->Name.Length = (USHORT)NameSize;
> +            ObjectNameInfo->Name.MaximumLength =
> +                (USHORT)(NameSize + sizeof(UNICODE_NULL));
> +            ObjectNameInfo->Name.Buffer = ObjectName;
> +        }
> +    }
> +    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
> +    {
> +        /* Return the exception code */
> +        Status = _SEH2_GetExceptionCode();
> +    }
> +    _SEH2_END;
>
>     /* Return success */
> -    return STATUS_SUCCESS;
> +    return Status;
>  }
>
>  VOID
>
>
>
_______________________________________________
Ros-dev mailing list
[email protected]
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to