[EVENTLOG]
authorThomas Faber <thomas.faber@reactos.org>
Sun, 12 Oct 2014 11:23:05 +0000 (11:23 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Sun, 12 Oct 2014 11:23:05 +0000 (11:23 +0000)
- In ElfGetLogHandleEntryByHandle, actually verify the validity of the handle by traversing the log handle list. Fixes crash in advapi32_winetest:eventlog (double close).
- Minor style improvements to ElfDeleteEventLogHandle
CORE-8621 #resolve

svn path=/trunk/; revision=64689

reactos/base/services/eventlog/rpc.c

index e7a6ac4..99f8d72 100644 (file)
@@ -196,31 +196,40 @@ Done:
 
 PLOGHANDLE ElfGetLogHandleEntryByHandle(IELF_HANDLE EventLogHandle)
 {
+    PLIST_ENTRY CurrentEntry;
     PLOGHANDLE lpLogHandle;
 
-    if (IsListEmpty(&LogHandleListHead))
+    CurrentEntry = LogHandleListHead.Flink;
+    while (CurrentEntry != &LogHandleListHead)
     {
-        return NULL;
-    }
+        lpLogHandle = CONTAINING_RECORD(CurrentEntry,
+                                        LOGHANDLE,
+                                        LogHandleListEntry);
+        CurrentEntry = CurrentEntry->Flink;
 
-    lpLogHandle = CONTAINING_RECORD((PLOGHANDLE)EventLogHandle, LOGHANDLE, LogHandleListEntry);
+        if (lpLogHandle == EventLogHandle)
+            return lpLogHandle;
+    }
 
-    return lpLogHandle;
+    return NULL;
 }
 
 
 static NTSTATUS
-ElfDeleteEventLogHandle(IELF_HANDLE EventLogHandle)
+ElfDeleteEventLogHandle(IELF_HANDLE LogHandle)
 {
-    PLOGHANDLE lpLogHandle = (PLOGHANDLE)EventLogHandle;
+    PLOGHANDLE lpLogHandle;
 
-    if (!ElfGetLogHandleEntryByHandle(lpLogHandle))
+    lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle);
+    if (!lpLogHandle)
+    {
         return STATUS_INVALID_HANDLE;
+    }
 
     RemoveEntryList(&lpLogHandle->LogHandleListEntry);
     LogfClose(lpLogHandle->LogFile, FALSE);
 
-    HeapFree(GetProcessHeap(),0,lpLogHandle);
+    HeapFree(GetProcessHeap(), 0, lpLogHandle);
 
     return STATUS_SUCCESS;
 }