From 3d43c5b6979eeae7b3225e1cb5314cb5a5eabb89 Mon Sep 17 00:00:00 2001 From: Tw Date: Tue, 2 Aug 2016 15:28:12 +0800 Subject: [PATCH] tls: fix TestStandaloneTLSTicketKeyRotation data race ================== WARNING: DATA RACE Write at 0x00c42049d300 by goroutine 26: github.com/mholt/caddy/caddytls.standaloneTLSTicketKeyRotation() /home/tw/golib/src/github.com/mholt/caddy/caddytls/crypto.go:230 +0x698 Previous read at 0x00c42049d300 by goroutine 25: github.com/mholt/caddy/caddytls.TestStandaloneTLSTicketKeyRotation() /home/tw/golib/src/github.com/mholt/caddy/caddytls/crypto_test.go:113 +0x413 testing.tRunner() /home/tw/goroot/src/testing/testing.go:610 +0xc9 Goroutine 26 (running) created at: github.com/mholt/caddy/caddytls.TestStandaloneTLSTicketKeyRotation() /home/tw/golib/src/github.com/mholt/caddy/caddytls/crypto_test.go:101 +0x2a4 testing.tRunner() /home/tw/goroot/src/testing/testing.go:610 +0xc9 Goroutine 25 (running) created at: testing.(*T).Run() /home/tw/goroot/src/testing/testing.go:646 +0x52f testing.RunTests.func1() /home/tw/goroot/src/testing/testing.go:793 +0xb9 testing.tRunner() /home/tw/goroot/src/testing/testing.go:610 +0xc9 testing.RunTests() /home/tw/goroot/src/testing/testing.go:799 +0x4b5 testing.(*M).Run() /home/tw/goroot/src/testing/testing.go:743 +0x12f github.com/mholt/caddy/caddytls.TestMain() /home/tw/golib/src/github.com/mholt/caddy/caddytls/setup_test.go:27 +0x133 main.main() github.com/mholt/caddy/caddytls/_test/_testmain.go:116 +0x1b1 ================== ================== WARNING: DATA RACE Write at 0x00c4204aa6c0 by goroutine 26: github.com/mholt/caddy/caddytls.TestStandaloneTLSTicketKeyRotation.func2() /home/tw/golib/src/github.com/mholt/caddy/caddytls/crypto_test.go:93 +0x56 github.com/mholt/caddy/caddytls.standaloneTLSTicketKeyRotation() /home/tw/golib/src/github.com/mholt/caddy/caddytls/crypto.go:233 +0x638 Previous read at 0x00c4204aa6c0 by goroutine 25: github.com/mholt/caddy/caddytls.TestStandaloneTLSTicketKeyRotation() /home/tw/golib/src/github.com/mholt/caddy/caddytls/crypto_test.go:108 +0x391 testing.tRunner() /home/tw/goroot/src/testing/testing.go:610 +0xc9 Goroutine 26 (running) created at: github.com/mholt/caddy/caddytls.TestStandaloneTLSTicketKeyRotation() /home/tw/golib/src/github.com/mholt/caddy/caddytls/crypto_test.go:101 +0x2a4 testing.tRunner() /home/tw/goroot/src/testing/testing.go:610 +0xc9 Goroutine 25 (running) created at: testing.(*T).Run() /home/tw/goroot/src/testing/testing.go:646 +0x52f testing.RunTests.func1() /home/tw/goroot/src/testing/testing.go:793 +0xb9 testing.tRunner() /home/tw/goroot/src/testing/testing.go:610 +0xc9 testing.RunTests() /home/tw/goroot/src/testing/testing.go:799 +0x4b5 testing.(*M).Run() /home/tw/goroot/src/testing/testing.go:743 +0x12f github.com/mholt/caddy/caddytls.TestMain() /home/tw/golib/src/github.com/mholt/caddy/caddytls/setup_test.go:27 +0x133 main.main() github.com/mholt/caddy/caddytls/_test/_testmain.go:116 +0x1b1 ================== Signed-off-by: Tw --- caddytls/crypto_test.go | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/caddytls/crypto_test.go b/caddytls/crypto_test.go index e4697ec4..bc96bd3f 100644 --- a/caddytls/crypto_test.go +++ b/caddytls/crypto_test.go @@ -79,19 +79,22 @@ func PrivateKeyBytes(key crypto.PrivateKey) []byte { } func TestStandaloneTLSTicketKeyRotation(t *testing.T) { + type syncPkt struct { + ticketKey [32]byte + keysInUse int + } + tlsGovChan := make(chan struct{}) defer close(tlsGovChan) - callSync := make(chan bool, 1) + callSync := make(chan *syncPkt, 1) defer close(callSync) oldHook := setSessionTicketKeysTestHook defer func() { setSessionTicketKeysTestHook = oldHook }() - var keysInUse [][32]byte setSessionTicketKeysTestHook = func(keys [][32]byte) [][32]byte { - keysInUse = keys - callSync <- true + callSync <- &syncPkt{keys[0], len(keys)} return keys } @@ -104,17 +107,17 @@ func TestStandaloneTLSTicketKeyRotation(t *testing.T) { var lastTicketKey [32]byte for { select { - case <-callSync: - if lastTicketKey == keysInUse[0] { + case pkt := <-callSync: + if lastTicketKey == pkt.ticketKey { close(tlsGovChan) t.Errorf("The same TLS ticket key has been used again (not rotated): %x.", lastTicketKey) return } - lastTicketKey = keysInUse[0] + lastTicketKey = pkt.ticketKey rounds++ - if rounds <= NumTickets && len(keysInUse) != rounds { + if rounds <= NumTickets && pkt.keysInUse != rounds { close(tlsGovChan) - t.Errorf("Expected TLS ticket keys in use: %d; Got instead: %d.", rounds, len(keysInUse)) + t.Errorf("Expected TLS ticket keys in use: %d; Got instead: %d.", rounds, pkt.keysInUse) return } if c.SessionTicketsDisabled == true {