Module: wine Branch: master Commit: 9277fcfdb4ff787bbf63e640bb7ed67567ed330d URL: http://source.winehq.org/git/wine.git/?a=commit;h=9277fcfdb4ff787bbf63e640bb...
Author: Sebastian Lackner sebastian@fds-team.de Date: Mon Mar 10 18:51:21 2014 +0100
ntdll: Fix possible race-condition in iocp poller code.
---
dlls/ntdll/threadpool.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/threadpool.c b/dlls/ntdll/threadpool.c index 5bf3385..e2fc6a5 100644 --- a/dlls/ntdll/threadpool.c +++ b/dlls/ntdll/threadpool.c @@ -235,12 +235,14 @@ NTSTATUS WINAPI RtlQueueWorkItem(PRTL_WORK_ITEM_ROUTINE Function, PVOID Context, */ static DWORD CALLBACK iocp_poller(LPVOID Arg) { + HANDLE cport = Arg; + while( TRUE ) { PRTL_OVERLAPPED_COMPLETION_ROUTINE callback; LPVOID overlapped; IO_STATUS_BLOCK iosb; - NTSTATUS res = NtRemoveIoCompletion( compl_port, (PULONG_PTR)&callback, (PULONG_PTR)&overlapped, &iosb, NULL ); + NTSTATUS res = NtRemoveIoCompletion( cport, (PULONG_PTR)&callback, (PULONG_PTR)&overlapped, &iosb, NULL ); if (res) { ERR("NtRemoveIoCompletion failed: 0x%x\n", res); @@ -297,7 +299,7 @@ NTSTATUS WINAPI RtlSetIoCompletionCallback(HANDLE FileHandle, PRTL_OVERLAPPED_CO if (!res) { /* FIXME native can start additional threads in case of e.g. hung callback function. */ - res = RtlQueueWorkItem( iocp_poller, NULL, WT_EXECUTEDEFAULT ); + res = RtlQueueWorkItem( iocp_poller, cport, WT_EXECUTEDEFAULT ); if (!res) compl_port = cport; else