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,
<fireball@svn.reactos.org>
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
Ros-dev@reactos.org
http://www.reactos.org/mailman/listinfo/ros-dev