Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update socks proxy properly handle closing of half-closed connections #38

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

bokysan
Copy link

@bokysan bokysan commented Nov 23, 2020

During testing of SocketAce I have encountered an issue that does not appear to happen when using standard net.Conn. Namely: when using io.Pipe instead of a standard network connection, the socks proxy would block indefinitely after the server connection is closed.

This is due to a fact that handleContext waits for both connections -- pipe from server to client and client to server -- to finish successfully.As these are represented by two different pipes, one would close but the other one would never finish.

This patch will wait for at least one of the pipes to finish and continue as soon as it does. The implementation will wait a bit just to make sure there are no errors in the second pipe but will continue soon after. All tests in the code seem to work. The new use case is covered by the new code in close_test.go.

To the best of my knowledge, this change should not affect any existing functionality.

During testing of [SocketAce](https://github.com/bokysan/socketace) I have encountered an issue that does not appear to happen when using standard `net.Conn`. Namely: when using `io.Pipe` instead of a standard network connection, the socks proxy would block indefinitely after the server connection is closed.

This is due to a fact that `handleContext` waits for both connections -- pipe from server to client and client to server -- to finish successfully.As these are represented by two different pipes, one would close but the other one would never finish.

This patch will wait for at least one of the pipes to finish and continue as soon as it does. The implementation will wait a bit just to make sure there are no errors in the second pipe but will continue soon after. All tests in the code seem to work. The new use case is covered by the new code in `close_test.go`.

To the best of my knowledge, this change should not affect any existing functionality.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant