Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This change prevents race conditions in programs that call the server's
Close()
orShutdown()
methods beforeServe()
. Consider a program that runs bothServe()
andClose()
in separate go routines, if a signal comes in early telling the program to shutdown, theClose()
method may be called beforeServe()
has completed its initialisation and begun tracking the listener.To fix this I've simply copied the latest approach from the Go standard library HTTP server and applied them. Since the SSH server was based on Go's stdlib implementation, bringing the latest stdlib changes was easy. For reference, we can see that in e.g. Go 1.10, there is very little difference between the two. Go 1.11 then removed the logic in
trackListener
that allowed the server to be reused and Go 1.20 made several changes like the removal of thedoneChan
in favour of an atomic boolean.While technically the change/inability to reuse a previously closed SSH server is a breaking one, the same issue was raised for Go's stdlib here and here where it was fixed.