-
Notifications
You must be signed in to change notification settings - Fork 204
Description
How do we replicate the issue?
- Testing script: https://gist.github.com/Yraid/5bb0b13b08b0f455d0e7288b776ecac0
- It works on newer distributions like Windows 10. For older distributions like Windows 2008 R2 and Windows 7, the server pending on L35 but the client is connected.
- Using
go-winio v0.6.1and Go program built with1.20.13
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?