caddytls: Fix data race in test (close #1844)

The race was in the test only; not in the production code
This commit is contained in:
Matthew Holt 2017-08-28 19:21:17 -06:00
parent 01f3593fd6
commit c0c7437fa5
No known key found for this signature in database
GPG key ID: 2A349DD577D586A5
2 changed files with 15 additions and 7 deletions

View file

@ -21,6 +21,7 @@ import (
"net"
"os"
"path/filepath"
"sync"
"time"
"golang.org/x/crypto/ocsp"
@ -243,8 +244,9 @@ func RotateSessionTicketKeys(cfg *tls.Config) chan struct{} {
// Functions that may be swapped out for testing
var (
runTLSTicketKeyRotation = standaloneTLSTicketKeyRotation
setSessionTicketKeysTestHook = func(keys [][32]byte) [][32]byte { return keys }
runTLSTicketKeyRotation = standaloneTLSTicketKeyRotation
setSessionTicketKeysTestHook = func(keys [][32]byte) [][32]byte { return keys }
setSessionTicketKeysTestHookMu sync.Mutex
)
// standaloneTLSTicketKeyRotation governs over the array of TLS ticket keys used to de/crypt TLS tickets.
@ -271,7 +273,10 @@ func standaloneTLSTicketKeyRotation(c *tls.Config, ticker *time.Ticker, exitChan
c.SessionTicketsDisabled = true // bail if we don't have the entropy for the first one
return
}
c.SetSessionTicketKeys(setSessionTicketKeysTestHook(keys))
setSessionTicketKeysTestHookMu.Lock()
setSessionTicketKeysHook := setSessionTicketKeysTestHook
setSessionTicketKeysTestHookMu.Unlock()
c.SetSessionTicketKeys(setSessionTicketKeysHook(keys))
for {
select {
@ -298,7 +303,7 @@ func standaloneTLSTicketKeyRotation(c *tls.Config, ticker *time.Ticker, exitChan
keys[0] = newTicketKey
}
// pushes the last key out, doesn't matter that we don't have a new one
c.SetSessionTicketKeys(setSessionTicketKeysTestHook(keys))
c.SetSessionTicketKeys(setSessionTicketKeysHook(keys))
}
}
}

View file

@ -86,17 +86,20 @@ func TestStandaloneTLSTicketKeyRotation(t *testing.T) {
tlsGovChan := make(chan struct{})
defer close(tlsGovChan)
callSync := make(chan *syncPkt, 1)
defer close(callSync)
callSync := make(chan syncPkt)
setSessionTicketKeysTestHookMu.Lock()
oldHook := setSessionTicketKeysTestHook
defer func() {
setSessionTicketKeysTestHookMu.Lock()
setSessionTicketKeysTestHook = oldHook
setSessionTicketKeysTestHookMu.Unlock()
}()
setSessionTicketKeysTestHook = func(keys [][32]byte) [][32]byte {
callSync <- &syncPkt{keys[0], len(keys)}
callSync <- syncPkt{keys[0], len(keys)}
return keys
}
setSessionTicketKeysTestHookMu.Unlock()
c := new(tls.Config)
timer := time.NewTicker(time.Millisecond * 1)