Skip to content

Commit 2520573

Browse files
Prevent indefinite hang for sql server detector (#4174)
* prevent indefinite hang for sql server detector * defer tcp conn close
1 parent 4cffadb commit 2520573

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

pkg/detectors/sqlserver/sqlserver.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package sqlserver
33
import (
44
"context"
55
"database/sql"
6+
"net"
7+
"strconv"
68
"time"
79

810
regexp "github.com/wasilibs/go-re2"
@@ -52,7 +54,7 @@ func (s Scanner) FromData(ctx context.Context, verify bool, data []byte) (result
5254
}
5355

5456
if verify {
55-
isVerified, err := ping(paramsUnsafe)
57+
isVerified, err := ping(ctx, paramsUnsafe)
5658

5759
s1.Verified = isVerified
5860

@@ -71,7 +73,20 @@ func (s Scanner) FromData(ctx context.Context, verify bool, data []byte) (result
7173
return results, nil
7274
}
7375

74-
var ping = func(config msdsn.Config) (bool, error) {
76+
var ping = func(ctx context.Context, config msdsn.Config) (bool, error) {
77+
// TCP connectivity check to prevent indefinite hangs
78+
address := net.JoinHostPort(config.Host, strconv.Itoa(int(config.Port)))
79+
80+
dialer := &net.Dialer{
81+
Timeout: 3 * time.Second,
82+
}
83+
84+
tcpConn, err := dialer.DialContext(ctx, "tcp", address) // respects context timeout
85+
if err != nil {
86+
return false, err
87+
}
88+
defer tcpConn.Close()
89+
7590
cleanConfig := msdsn.Config{}
7691
cleanConfig.Host = config.Host
7792
cleanConfig.Port = config.Port
@@ -97,7 +112,7 @@ var ping = func(config msdsn.Config) (bool, error) {
97112
_ = conn.Close()
98113
}()
99114

100-
err = conn.Ping()
115+
err = conn.PingContext(ctx) // this doesn't seem to respect the context timeout
101116
if err != nil {
102117
return false, err
103118
}

pkg/detectors/sqlserver/sqlserver_integration_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ package sqlserver
55

66
import (
77
"context"
8+
"errors"
89
"fmt"
910
"net/url"
1011
"testing"
1112

1213
"github.com/brianvoe/gofakeit/v7"
1314
"github.com/google/go-cmp/cmp"
1415
"github.com/google/go-cmp/cmp/cmpopts"
16+
"github.com/microsoft/go-mssqldb/msdsn"
1517
"github.com/testcontainers/testcontainers-go"
1618
"github.com/testcontainers/testcontainers-go/modules/mssql"
1719

0 commit comments

Comments
 (0)