Skip to content

Commit 4c84659

Browse files
julienschmidtTim Olsen
authored and
Tim Olsen
committed
utils: guard tlsConfigRegister by a lock (go-sql-driver#613)
* utils: guard tlsConfigRegister by a lock Fixes go-sql-driver#610 * utils: move TLSConfig lock and clone logic to helper func
1 parent a6af165 commit 4c84659

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

dsn.go

+1-3
Original file line numberDiff line numberDiff line change
@@ -506,9 +506,7 @@ func parseDSNParams(cfg *Config, params string) (err error) {
506506
return fmt.Errorf("invalid value for TLS config name: %v", err)
507507
}
508508

509-
if tlsConfig, ok := tlsConfigRegister[name]; ok {
510-
tlsConfig = cloneTLSConfig(tlsConfig)
511-
509+
if tlsConfig := getTLSConfigClone(name); tlsConfig != nil {
512510
if len(tlsConfig.ServerName) == 0 && !tlsConfig.InsecureSkipVerify {
513511
host, _, err := net.SplitHostPort(cfg.Addr)
514512
if err == nil {

utils.go

+15
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@ import (
1616
"fmt"
1717
"io"
1818
"strings"
19+
"sync"
1920
"time"
2021
)
2122

2223
var (
24+
tlsConfigLock sync.RWMutex
2325
tlsConfigRegister map[string]*tls.Config // Register for custom tls.Configs
2426
)
2527

@@ -53,19 +55,32 @@ func RegisterTLSConfig(key string, config *tls.Config) error {
5355
return fmt.Errorf("key '%s' is reserved", key)
5456
}
5557

58+
tlsConfigLock.Lock()
5659
if tlsConfigRegister == nil {
5760
tlsConfigRegister = make(map[string]*tls.Config)
5861
}
5962

6063
tlsConfigRegister[key] = config
64+
tlsConfigLock.Unlock()
6165
return nil
6266
}
6367

6468
// DeregisterTLSConfig removes the tls.Config associated with key.
6569
func DeregisterTLSConfig(key string) {
70+
tlsConfigLock.Lock()
6671
if tlsConfigRegister != nil {
6772
delete(tlsConfigRegister, key)
6873
}
74+
tlsConfigLock.Unlock()
75+
}
76+
77+
func getTLSConfigClone(key string) (config *tls.Config) {
78+
tlsConfigLock.RLock()
79+
if v, ok := tlsConfigRegister[key]; ok {
80+
config = cloneTLSConfig(v)
81+
}
82+
tlsConfigLock.RUnlock()
83+
return
6984
}
7085

7186
// Returns the bool value of the input.

0 commit comments

Comments
 (0)