Skip to content

Bug: Error process of GetQueuedCompletionStatus in syelogd.cpp. #264

@qieziting

Description

@qieziting

Describe the bug
When I use syslog to test my project, I found there is a bug in error process of GetQueuedCompletionStatus in syslogd.cpp (line 334).
The else branch will never be triggered.
And in this logic if client closed a piep, a work thread will exit.

       if (!b || lpo == NULL) {
            fKeepLooping = FALSE;
            MyErrExit("GetQueuedCompletionState");
            break;
        }
        else if (!b) {
            if (pClient) {
                if (GetLastError() == ERROR_BROKEN_PIPE) {
                    LogMessageV(SYELOG_SEVERITY_INFORMATION, "Client closed pipe.");
                }
                else {
                    LogMessageV(SYELOG_SEVERITY_ERROR,
                                "GetQueuedCompletionStatus failed %d [%p]",
                                GetLastError(), pClient);
                }
                CloseConnection(pClient);
            }
            continue;
        }

Expected behavior
I thought thread will exit only when both return value is false and lpo is NULL, as description in doc of GetQueuedCompletionStatus:

If a call to GetQueuedCompletionStatus fails because the completion port handle associated with it is closed while the call is outstanding, the function returns FALSE, *lpOverlapped will be NULL, and GetLastError will return ERROR_ABANDONED_WAIT_0.

I will create a PR for it.

Detours version

current master

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions