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?
How do we replicate the issue?
go-winio v0.6.1and Go program built with1.20.13Finding
I used
dlvto look around and it turned out thatconnectNamedPipecan't getERROR_IO_CONNECTEDon older platforms. It gotERROR_IO_PENDING. Thus the followingasyncIOcall is pending forever (so doesconnectPipeandAccept). On the other hand, newer platforms can getERROR_IO_CONNECTED.I'm not sure if the
connectNamedPipecall 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
makeServerPipeHandlecall:The reason for ignoring
windows.ERROR_PIPE_BUSYis 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 callfs.CreateFileto keep the pipe server "awake".Questions