-
v1.1.8-alpha1
released this
2026-07-17 22:36:23 +07:00 | 44 commits to main since this releaseComprehensive fixes for race conditions, concurrency bugs, and a critical session handling bug across the session package and its child packages.
-
Changed
waitForTCPIPForward()from a single select to a for loop that drains non-tcpip-forward requests gracefully -
Non-tcpip-forward requests now receive a false reply and the function continues waiting for the actual forward request
-
The 500ms timeout resets after each request to handle slow clients with multiple early requests
-
Updated and added tests to cover the new behavior: Wrong_Request_Type_Then_Timeout, Multiple_Non-Forward_Requests_Then_Success, Timeout_After_Non-Forward_Requests
-
Added sync.RWMutex to the forwarder struct to protect concurrent field access
-
Fixed data race in forwarder setters (
SetType(),SetForwardedPort(),SetListener()) by addingLock()/Unlock()protection -
Fixed data race in forwarder getters (
TunnelType(),ForwardedPort(),Listener()) by addingRLock()/RUnlock()protection -
Added sync.RWMutex to the slug struct to protect concurrent field access
-
Fixed data race in
slug.Set()by addingLock()/Unlock()protection -
Fixed data race in
slug.String()by addingRLock()/RUnlock()protection -
Changed
OpenForwardedChannel()to usef.ForwardedPort()getter instead of direct field access -
Fixed
Close()in forwarder to usef.Listener()getter consistently instead of accessingf.listenerdirectly -
Fixed data race in
HandleTCPForward()where the goroutine runningtcpServer.Serve(listener)wrote to the outer err variable from the enclosing function scope -
Changed err =
tcpServer.Serve(listener)toif err := tcpServer.Serve(listener)so the goroutine uses a local variable
Downloads
-