Skip to content

pipe.Accept() hangs on Windows 2008 R2 and Windows 7 #313

@Yraid

Description

@Yraid

How do we replicate the issue?

Finding

I used dlv to look around and it turned out that connectNamedPipe can't get ERROR_IO_CONNECTED on older platforms. It got ERROR_IO_PENDING. Thus the following asyncIO call is pending forever (so does connectPipe and Accept). On the other hand, newer platforms can get ERROR_IO_CONNECTED.

I'm not sure if the connectNamedPipe call is implemented differently on platforms like Windows 2008 R2 and Windows 10.
I refer to changes: #125 and #80 and I can fix this issue by adding the following code snippets in ListenPipe after the makeServerPipeHandle call:

h2, err := fs.CreateFile(path, 0, 0, nil, syscall.OPEN_EXISTING, fs.SECURITY_SQOS_PRESENT|fs.SECURITY_ANONYMOUS, 0)
if err != nil && err != windows.ERROR_PIPE_BUSY {
 	syscall.Close(syscall.Handle(h))
 	return nil, err
}
if err == nil {
        syscall.Close(syscall.Handle(h2))
}

The reason for ignoring windows.ERROR_PIPE_BUSY is that we got this error when a real client is connecting before the dummy client, but we don't care about this error as the dummy client will be closed soon. The idea is to call fs.CreateFile to keep the pipe server "awake".

Questions

  • Could someone provide me with an idea about the issue?
  • Does the fix (the dummy connection approach) make good sense?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions