Author: tfaber
Date: Fri Apr 25 11:23:16 2014
New Revision: 62963
URL:
http://svn.reactos.org/svn/reactos?rev=62963&view=rev
Log:
[WIN32K]
- Correctly treat nLengthNeeded as optional in NtUserGetObjectInformation, and access it
only within SEH. Fixes crash in user32_winetest:winstation
CORE-8094
Modified:
trunk/reactos/win32ss/user/ntuser/winsta.c
Modified: trunk/reactos/win32ss/user/ntuser/winsta.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/winsta…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/winsta.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/winsta.c [iso-8859-1] Fri Apr 25 11:23:16 2014
@@ -641,6 +641,19 @@
PVOID pvData = NULL;
DWORD nDataSize = 0;
+ _SEH2_TRY
+ {
+ if (nLengthNeeded)
+ ProbeForWrite(nLengthNeeded, sizeof(*nLengthNeeded), 1);
+ ProbeForWrite(pvInformation, nLength, 1);
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ SetLastNtError(_SEH2_GetExceptionCode());
+ return FALSE;
+ }
+ _SEH2_END;
+
/* try windowstation */
TRACE("Trying to open window station %p\n", hObject);
Status = ObReferenceObjectByHandle(
@@ -665,8 +678,7 @@
if (!NT_SUCCESS(Status))
{
ERR("Failed: 0x%x\n", Status);
- SetLastNtError(Status);
- return FALSE;
+ goto Exit;
}
TRACE("WinSta or Desktop opened!!\n");
@@ -723,16 +735,27 @@
break;
}
- /* try to copy data to caller */
- if (Status == STATUS_SUCCESS)
- {
- TRACE("Trying to copy data to caller (len = %lu, len needed = %lu)\n",
nLength, nDataSize);
- *nLengthNeeded = nDataSize;
- if (nLength >= nDataSize)
- Status = MmCopyToCaller(pvInformation, pvData, nDataSize);
- else
- Status = STATUS_BUFFER_TOO_SMALL;
- }
+Exit:
+ _SEH2_TRY
+ {
+ if (nLengthNeeded)
+ *nLengthNeeded = nDataSize;
+
+ /* try to copy data to caller */
+ if (Status == STATUS_SUCCESS)
+ {
+ TRACE("Trying to copy data to caller (len = %lu, len needed = %lu)\n",
nLength, nDataSize);
+ if (nLength >= nDataSize)
+ RtlCopyMemory(pvInformation, pvData, nDataSize);
+ else
+ Status = STATUS_BUFFER_TOO_SMALL;
+ }
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
/* release objects */
if (WinStaObject != NULL)