From 23f1dbfe503de46d4fe92eb9eccf6c735e480f59 Mon Sep 17 00:00:00 2001 From: Loi Nguyen Date: Sun, 2 Aug 2026 17:53:25 +0700 Subject: [PATCH] smb: test closing failed dial connections Followup to: 74f9f182aa0b3050 smb: fix TCP connection leak when connection setup fails - #9678 --- backend/smb/smb_internal_test.go | 45 +++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/backend/smb/smb_internal_test.go b/backend/smb/smb_internal_test.go index d380cd4fd..46f348754 100644 --- a/backend/smb/smb_internal_test.go +++ b/backend/smb/smb_internal_test.go @@ -1,7 +1,50 @@ // Unit tests for internal SMB functions package smb -import "testing" +import ( + "context" + "io" + "net" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestDialClosesConnectionOnSetupError(t *testing.T) { + listener, err := net.Listen("tcp", "127.0.0.1:0") + require.NoError(t, err) + defer func() { require.NoError(t, listener.Close()) }() + + type acceptResult struct { + conn net.Conn + err error + } + accepted := make(chan acceptResult, 1) + go func() { + conn, err := listener.Accept() + accepted <- acceptResult{conn: conn, err: err} + }() + + f := &Fs{opt: Options{Pass: "invalid"}} + _, err = f.dial(context.Background(), "tcp", listener.Addr().String()) + require.Error(t, err) + + var result acceptResult + select { + case result = <-accepted: + case <-time.After(time.Second): + t.Fatal("timed out waiting for server to accept connection") + } + require.NoError(t, result.err) + defer func() { require.NoError(t, result.conn.Close()) }() + require.NoError(t, result.conn.SetReadDeadline(time.Now().Add(time.Second))) + + buffer := make([]byte, 1) + n, err := result.conn.Read(buffer) + require.Zero(t, n) + require.ErrorIs(t, err, io.EOF) +} // TestIsPathDir tests the isPathDir function logic func TestIsPathDir(t *testing.T) {