mirror of
https://github.com/WinDurango/Detours.git
synced 2026-01-31 00:55:20 +01:00
Fix: Handle ERROR_PIPE_CONNECTED error from ConnectNamedPipe in syelogd
Fixes #241 Co-authored-by: fishjam <fish.jam@navercorp.com>
This commit is contained in:
@@ -50,6 +50,7 @@ LONGLONG s_llStartTime = 0;
|
||||
LONGLONG s_llLastTime = 0;
|
||||
|
||||
BOOL LogMessageV(BYTE nSeverity, PCHAR pszMsg, ...);
|
||||
VOID AcceptAndCreatePipeConnection(PCLIENT pClient, HANDLE hCompletionPort);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
@@ -181,8 +182,14 @@ PCLIENT CreatePipeConnection(HANDLE hCompletionPort)
|
||||
}
|
||||
|
||||
if (!ConnectNamedPipe(hPipe, pClient)) {
|
||||
if (GetLastError() != ERROR_IO_PENDING &&
|
||||
GetLastError() != ERROR_PIPE_LISTENING) {
|
||||
DWORD dwLastErr = GetLastError();
|
||||
//Handle race between multiple client connections
|
||||
//example: multi thread or client request at alomst same time.
|
||||
if (ERROR_PIPE_CONNECTED == dwLastErr)
|
||||
{
|
||||
AcceptAndCreatePipeConnection(pClient, hCompletionPort);
|
||||
} else if ( dwLastErr != ERROR_IO_PENDING &&
|
||||
dwLastErr != ERROR_PIPE_LISTENING) {
|
||||
MyErrExit("ConnectNamedPipe");
|
||||
}
|
||||
}
|
||||
@@ -193,6 +200,25 @@ PCLIENT CreatePipeConnection(HANDLE hCompletionPort)
|
||||
return pClient;
|
||||
}
|
||||
|
||||
VOID AcceptAndCreatePipeConnection(PCLIENT pClient, HANDLE hCompletionPort) {
|
||||
DWORD nBytes = 0;
|
||||
InterlockedIncrement(&s_nActiveClients);
|
||||
pClient->fAwaitingAccept = FALSE;
|
||||
BOOL b = ReadFile(pClient->hPipe,
|
||||
&pClient->Message,
|
||||
sizeof(pClient->Message),
|
||||
&nBytes,
|
||||
pClient);
|
||||
if (!b) {
|
||||
if (GetLastError() != ERROR_IO_PENDING) {
|
||||
LogMessageV(SYELOG_SEVERITY_ERROR,
|
||||
"ReadFile failed %d.", GetLastError());
|
||||
}
|
||||
}
|
||||
|
||||
CreatePipeConnection(hCompletionPort);
|
||||
}
|
||||
|
||||
BOOL LogMessageV(BYTE nSeverity, PCHAR pszMsg, ...)
|
||||
{
|
||||
FILETIME ftOccurance;
|
||||
@@ -352,22 +378,7 @@ DWORD WINAPI WorkerThread(LPVOID pvVoid)
|
||||
}
|
||||
|
||||
if (pClient->fAwaitingAccept) {
|
||||
InterlockedIncrement(&s_nActiveClients);
|
||||
pClient->fAwaitingAccept = FALSE;
|
||||
b = ReadFile(pClient->hPipe,
|
||||
&pClient->Message,
|
||||
sizeof(pClient->Message),
|
||||
&nBytes,
|
||||
pClient);
|
||||
if (!b) {
|
||||
if (GetLastError() != ERROR_IO_PENDING) {
|
||||
LogMessageV(SYELOG_SEVERITY_ERROR,
|
||||
"ReadFile failed %d.", GetLastError());
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
CreatePipeConnection(hCompletionPort);
|
||||
AcceptAndCreatePipeConnection(pClient, hCompletionPort);
|
||||
}
|
||||
else {
|
||||
if (nBytes < offsetof(SYELOG_MESSAGE, szMessage)) {
|
||||
|
||||
Reference in New Issue
Block a user