Author: mjmartin
Date: Sun May 17 15:31:58 2009
New Revision: 40953

URL: http://svn.reactos.org/svn/reactos?rev=40953&view=rev
Log:
- ReadEventLogA/ReadEventLogW: Check for lpBuffer for NULL and if so set 
nNumberOfBytesToRead to zero so that rpcrt4 does not access a NULL buffer.
  Set pnBytesRead and pnMinNumberOfBytesNeeded variables prior to checking for 
failure and returning FALSE.
  In preparation for implementation of EventLog.

Modified:
    trunk/reactos/dll/win32/advapi32/service/eventlog.c

Modified: trunk/reactos/dll/win32/advapi32/service/eventlog.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/advapi32/service/eventlog.c?rev=40953&r1=40952&r2=40953&view=diff
==============================================================================
--- trunk/reactos/dll/win32/advapi32/service/eventlog.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/advapi32/service/eventlog.c [iso-8859-1] Sun May 17 
15:31:58 2009
@@ -632,6 +632,13 @@
         hEventLog, dwReadFlags, dwRecordOffset, lpBuffer,
         nNumberOfBytesToRead, pnBytesRead, pnMinNumberOfBytesNeeded);
 
+    /* If buffer is NULL set nNumberOfBytesToRead to 0 to prevent rpcrt4 from
+       trying to access a null pointer */
+    if (!lpBuffer)
+    {
+        nNumberOfBytesToRead = 0;
+    }
+
     RpcTryExcept
     {
         Status = ElfrReadELA(hEventLog,
@@ -648,14 +655,14 @@
     }
     RpcEndExcept;
 
-    if (!NT_SUCCESS(Status))
-    {
-        SetLastError(RtlNtStatusToDosError(Status));
-        return FALSE;
-    }
-
     *pnBytesRead = (DWORD)bytesRead;
     *pnMinNumberOfBytesNeeded = (DWORD)minNumberOfBytesNeeded;
+
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastError(RtlNtStatusToDosError(Status));
+        return FALSE;
+    }
 
     return TRUE;
 }
@@ -689,6 +696,13 @@
         hEventLog, dwReadFlags, dwRecordOffset, lpBuffer,
         nNumberOfBytesToRead, pnBytesRead, pnMinNumberOfBytesNeeded);
 
+    /* If buffer is NULL set nNumberOfBytesToRead to 0 to prevent rpcrt4 from
+       trying to access a null pointer */
+    if (!lpBuffer)
+    {
+        nNumberOfBytesToRead = 0;
+    }
+
     RpcTryExcept
     {
         Status = ElfrReadELW(hEventLog,
@@ -705,14 +719,14 @@
     }
     RpcEndExcept;
 
-    if (!NT_SUCCESS(Status))
-    {
-        SetLastError(RtlNtStatusToDosError(Status));
-        return FALSE;
-    }
-
     *pnBytesRead = (DWORD)bytesRead;
     *pnMinNumberOfBytesNeeded = (DWORD)minNumberOfBytesNeeded;
+
+    if (!NT_SUCCESS(Status))
+    {
+        SetLastError(RtlNtStatusToDosError(Status));
+        return FALSE;
+    }
 
     return TRUE;
 }

Reply via email to