• v1.1.8-alpha1
    SonarQube Scan / SonarQube Trigger (push) Successful in 4m1s
    Docker Build and Push / Run Tests (push) Successful in 2m28s
    Docker Build and Push / Build and Push Docker Image (push) Successful in 14m52s

    bagas released this 2026-07-17 22:36:23 +07:00 | 44 commits to main since this release

    Comprehensive 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 adding Lock()/Unlock() protection

    • Fixed data race in forwarder getters (TunnelType(), ForwardedPort(), Listener()) by adding RLock()/RUnlock() protection

    • Added sync.RWMutex to the slug struct to protect concurrent field access

    • Fixed data race in slug.Set() by adding Lock()/Unlock() protection

    • Fixed data race in slug.String() by adding RLock()/RUnlock() protection

    • Changed OpenForwardedChannel() to use f.ForwardedPort() getter instead of direct field access

    • Fixed Close() in forwarder to use f.Listener() getter consistently instead of accessing f.listener directly

    • Fixed data race in HandleTCPForward() where the goroutine running tcpServer.Serve(listener) wrote to the outer err variable from the enclosing function scope

    • Changed err = tcpServer.Serve(listener) to if err := tcpServer.Serve(listener) so the goroutine uses a local variable

    Downloads