Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

Commit ced92a7

Browse files
committed
[FAB-10481] Fix data race in configless test
Pre-load all certs and keys. Change-Id: Iaf7f6c225a43fe4501b959548c7400f10e37c067 Signed-off-by: Bob Stasyszyn <Bob.Stasyszyn@securekey.com>
1 parent 58ce93d commit ced92a7

File tree

2 files changed

+27
-106
lines changed

2 files changed

+27
-106
lines changed

test/integration/e2e/configless/endpointconfig_override_test.go

Lines changed: 26 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ package configless
99
import (
1010
"crypto/tls"
1111
"crypto/x509"
12+
"fmt"
1213
"os"
1314
"regexp"
1415
"strings"
@@ -49,11 +50,11 @@ var (
4950
clientConfig = msp.ClientConfig{
5051
Organization: "org1",
5152
Logging: api.LoggingType{Level: "info"},
52-
CryptoConfig: msp.CCType{Path: "${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}"},
53+
CryptoConfig: msp.CCType{Path: pathvar.Subst("${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}")},
5354
CredentialStore: msp.CredentialStoreType{Path: "/tmp/msp"},
5455
TLSCerts: endpoint.MutualTLSConfig{Client: endpoint.TLSKeyPair{
55-
Key: endpoint.TLSConfig{Path: pathvar.Subst("${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/config/mutual_tls/client_sdk_go-key.pem")},
56-
Cert: endpoint.TLSConfig{Path: pathvar.Subst("${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/config/mutual_tls/client_sdk_go.pem")}}},
56+
Key: newTLSConfig("${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/config/mutual_tls/client_sdk_go-key.pem"),
57+
Cert: newTLSConfig("${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/config/mutual_tls/client_sdk_go.pem")}},
5758
}
5859

5960
channelsConfig = map[string]fab.ChannelNetworkConfig{
@@ -140,9 +141,7 @@ var (
140141
"fail-fast": false,
141142
"allow-insecure": false,
142143
},
143-
TLSCACerts: endpoint.TLSConfig{
144-
Path: "${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem",
145-
},
144+
TLSCACerts: newTLSConfig("${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem"),
146145
},
147146
}
148147

@@ -158,9 +157,7 @@ var (
158157
"fail-fast": false,
159158
"allow-insecure": false,
160159
},
161-
TLSCACerts: endpoint.TLSConfig{
162-
Path: "${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem",
163-
},
160+
TLSCACerts: newTLSConfig("${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem"),
164161
},
165162
"peer0.org2.example.com": {
166163
URL: "peer0.org2.example.com:8051",
@@ -173,24 +170,18 @@ var (
173170
"fail-fast": false,
174171
"allow-insecure": false,
175172
},
176-
TLSCACerts: endpoint.TLSConfig{
177-
Path: "${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/peerOrganizations/org2.example.com/tlsca/tlsca.org2.example.com-cert.pem",
178-
},
173+
TLSCACerts: newTLSConfig("${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/peerOrganizations/org2.example.com/tlsca/tlsca.org2.example.com-cert.pem"),
179174
},
180175
}
181176

182177
caConfig = map[string]msp.CAConfig{
183178
"ca.org1.example.com": {
184179
URL: "https://ca.org1.example.com:7054",
185180
TLSCACerts: endpoint.MutualTLSConfig{
186-
Path: "${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/fabricca/tls/certs/ca_root.pem",
181+
Path: pathvar.Subst("${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/fabricca/tls/certs/ca_root.pem"),
187182
Client: endpoint.TLSKeyPair{
188-
Key: endpoint.TLSConfig{
189-
Path: "${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/fabricca/tls/certs/client/client_fabric_client-key.pem",
190-
},
191-
Cert: endpoint.TLSConfig{
192-
Path: "${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/fabricca/tls/certs/client/client_fabric_client.pem",
193-
},
183+
Key: newTLSConfig("${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/fabricca/tls/certs/client/client_fabric_client-key.pem"),
184+
Cert: newTLSConfig("${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/fabricca/tls/certs/client/client_fabric_client.pem"),
194185
},
195186
},
196187
Registrar: msp.EnrollCredentials{
@@ -202,14 +193,10 @@ var (
202193
"ca.org2.example.com": {
203194
URL: "https://ca.org2.example.com:8054",
204195
TLSCACerts: endpoint.MutualTLSConfig{
205-
Path: "${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/fabricca/tls/certs/ca_root.pem",
196+
Path: pathvar.Subst("${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/fabricca/tls/certs/ca_root.pem"),
206197
Client: endpoint.TLSKeyPair{
207-
Key: endpoint.TLSConfig{
208-
Path: "${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/fabricca/tls/certs/client/client_fabric_client-key.pem",
209-
},
210-
Cert: endpoint.TLSConfig{
211-
Path: "${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/fabricca/tls/certs/client/client_fabric_client.pem",
212-
},
198+
Key: newTLSConfig("${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/fabricca/tls/certs/client/client_fabric_client-key.pem"),
199+
Cert: newTLSConfig("${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/test/fixtures/fabricca/tls/certs/client/client_fabric_client.pem"),
213200
},
214201
},
215202
Registrar: msp.EnrollCredentials{
@@ -389,13 +376,7 @@ func (m *exampleOrderersConfig) OrderersConfig() ([]fab.OrdererConfig, bool) {
389376

390377
for _, orderer := range orderersConfig {
391378

392-
if orderer.TLSCACerts.Path != "" {
393-
orderer.TLSCACerts.Path = pathvar.Subst(orderer.TLSCACerts.Path)
394-
} else if len(orderer.TLSCACerts.Pem) == 0 && !m.isSystemCertPool {
395-
return nil, false
396-
}
397-
err := orderer.TLSCACerts.LoadBytes()
398-
if err != nil {
379+
if orderer.TLSCACerts.Path == "" && len(orderer.TLSCACerts.Pem) == 0 && !m.isSystemCertPool {
399380
return nil, false
400381
}
401382
orderers = append(orderers, orderer)
@@ -419,13 +400,6 @@ func (m *exampleOrdererConfig) OrdererConfig(ordererNameOrURL string) (*fab.Orde
419400
return nil, false
420401
}
421402

422-
if orderer.TLSCACerts.Path != "" {
423-
orderer.TLSCACerts.Path = pathvar.Subst(orderer.TLSCACerts.Path)
424-
}
425-
err := orderer.TLSCACerts.LoadBytes()
426-
if err != nil {
427-
return nil, false
428-
}
429403
return &orderer, true
430404
}
431405

@@ -477,14 +451,6 @@ func (m *examplePeersConfig) PeersConfig(org string) ([]fab.PeerConfig, bool) {
477451
//p = *matchingPeerConfig
478452
return nil, false
479453
}
480-
if p.TLSCACerts.Path != "" {
481-
p.TLSCACerts.Path = pathvar.Subst(p.TLSCACerts.Path)
482-
}
483-
err := p.TLSCACerts.LoadBytes()
484-
if err != nil {
485-
return nil, false
486-
}
487-
488454
peers = append(peers, p)
489455
}
490456
return peers, true
@@ -508,15 +474,6 @@ func (m *examplePeerConfig) PeerConfig(nameOrURL string) (*fab.PeerConfig, bool)
508474
if ok {
509475
return &pcfg, true
510476
}
511-
if pcfg.TLSCACerts.Path != "" {
512-
pcfg.TLSCACerts.Path = pathvar.Subst(pcfg.TLSCACerts.Path)
513-
}
514-
err := pcfg.TLSCACerts.LoadBytes()
515-
if err != nil {
516-
return nil, false
517-
}
518-
// EntityMatchers are not used in this implementation
519-
// see default implementation (pkg/fab/endpointconfig.go) to see how they're used
520477

521478
return nil, false
522479
}
@@ -543,15 +500,6 @@ func (m *exampleNetworkPeers) NetworkPeers() ([]fab.NetworkPeer, bool) {
543500
return nil, false
544501
}
545502

546-
if p.TLSCACerts.Path != "" {
547-
p.TLSCACerts.Path = pathvar.Subst(p.TLSCACerts.Path)
548-
}
549-
550-
err := p.TLSCACerts.LoadBytes()
551-
if err != nil {
552-
return nil, false
553-
}
554-
555503
mspID, ok := PeerMSPID(name)
556504
if !ok {
557505
return nil, false
@@ -563,6 +511,7 @@ func (m *exampleNetworkPeers) NetworkPeers() ([]fab.NetworkPeer, bool) {
563511

564512
return netPeers, true
565513
}
514+
566515
func (m *exampleNetworkPeers) verifyPeerConfig(p fab.PeerConfig, peerName string, tlsEnabled bool) error {
567516
if p.URL == "" {
568517
return errors.Errorf("URL does not exist or empty for peer %s", peerName)
@@ -630,15 +579,6 @@ func (m *exampleChannelPeers) ChannelPeers(channelName string) ([]fab.ChannelPee
630579
return nil, false
631580
}
632581

633-
if p.TLSCACerts.Path != "" {
634-
p.TLSCACerts.Path = pathvar.Subst(p.TLSCACerts.Path)
635-
}
636-
637-
err := p.TLSCACerts.LoadBytes()
638-
if err != nil {
639-
return nil, false
640-
}
641-
642582
mspID, ok := PeerMSPID(peerName)
643583
if !ok {
644584
return nil, false
@@ -684,10 +624,6 @@ func (m *exampleChannelOrderers) ChannelOrderers(channelName string) ([]fab.Orde
684624
if !ok || orderer == nil {
685625
return nil, false
686626
}
687-
err := orderer.TLSCACerts.LoadBytes()
688-
if err != nil {
689-
return nil, false
690-
}
691627
orderers = append(orderers, *orderer)
692628
}
693629

@@ -723,19 +659,12 @@ func (m *exampleEventServiceType) EventServiceType() fab.EventServiceType {
723659
}
724660

725661
type exampleTLSClientCerts struct {
726-
RWLock *sync.RWMutex
662+
RWLock sync.RWMutex
727663
}
728664

729665
// TLSClientCerts overrides EndpointConfig's TLSClientCerts function which will return the list of configured client certs
730666
func (m *exampleTLSClientCerts) TLSClientCerts() ([]tls.Certificate, error) {
731-
if m.RWLock == nil {
732-
m.RWLock = &sync.RWMutex{}
733-
}
734667
var clientCerts tls.Certificate
735-
err := clientConfig.TLSCerts.Client.Cert.LoadBytes()
736-
if err != nil {
737-
return nil, err
738-
}
739668
cb := clientConfig.TLSCerts.Client.Cert.Bytes()
740669

741670
if len(cb) == 0 {
@@ -764,14 +693,10 @@ func (m *exampleTLSClientCerts) TLSClientCerts() ([]tls.Certificate, error) {
764693
}
765694
func (m *exampleTLSClientCerts) loadPrivateKeyFromConfig(clientConfig *msp.ClientConfig, clientCerts tls.Certificate, cb []byte) ([]tls.Certificate, error) {
766695

767-
err := clientConfig.TLSCerts.Client.Key.LoadBytes()
768-
if err != nil {
769-
return nil, err
770-
}
771696
kb := clientConfig.TLSCerts.Client.Key.Bytes()
772697

773698
// load the key/cert pair from []byte
774-
clientCerts, err = tls.X509KeyPair(cb, kb)
699+
clientCerts, err := tls.X509KeyPair(cb, kb)
775700
if err != nil {
776701
return nil, errors.Errorf("Error loading cert/key pair as TLS client credentials: %v", err)
777702
}
@@ -782,5 +707,13 @@ func (m *exampleTLSClientCerts) loadPrivateKeyFromConfig(clientConfig *msp.Clien
782707
type exampleCryptoConfigPath struct{}
783708

784709
func (m *exampleCryptoConfigPath) CryptoConfigPath() string {
785-
return pathvar.Subst(clientConfig.CryptoConfig.Path)
710+
return clientConfig.CryptoConfig.Path
711+
}
712+
713+
func newTLSConfig(path string) endpoint.TLSConfig {
714+
config := endpoint.TLSConfig{Path: pathvar.Subst(path)}
715+
if err := config.LoadBytes(); err != nil {
716+
panic(fmt.Sprintf("error loading bytes: %s", err))
717+
}
718+
return config
786719
}

test/integration/e2e/configless/identityconfig_override_test.go

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212

1313
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
1414
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/msp"
15-
"github.com/hyperledger/fabric-sdk-go/pkg/util/pathvar"
1615
"github.com/pkg/errors"
1716
)
1817

@@ -49,9 +48,6 @@ func (m *exampleClient) Client() (*msp.ClientConfig, error) {
4948
client := networkConfig.Client
5049

5150
client.Organization = strings.ToLower(client.Organization)
52-
client.TLSCerts.Path = pathvar.Subst(client.TLSCerts.Path)
53-
client.TLSCerts.Client.Key.Path = pathvar.Subst(client.TLSCerts.Client.Key.Path)
54-
client.TLSCerts.Client.Cert.Path = pathvar.Subst(client.TLSCerts.Client.Cert.Path)
5551

5652
return &client, nil
5753
}
@@ -110,7 +106,7 @@ func (m *exampleCaServerCerts) CAServerCerts(org string) ([][]byte, error) {
110106
certFiles := strings.Split(caConfig.TLSCACerts.Path, ",")
111107
serverCerts = make([][]byte, len(certFiles))
112108
for i, certPath := range certFiles {
113-
bytes, err := ioutil.ReadFile(pathvar.Subst(certPath))
109+
bytes, err := ioutil.ReadFile(certPath)
114110
if err != nil {
115111
return nil, errors.Wrapf(err, "failed to load pem bytes from path %s", certPath)
116112
}
@@ -127,10 +123,6 @@ func (m *exampleCaClientKey) CAClientKey(org string) ([]byte, error) {
127123
return nil, err
128124
}
129125

130-
//subst path
131-
caConfig.TLSCACerts.Client.Key.Path = pathvar.Subst(caConfig.TLSCACerts.Client.Key.Path)
132-
err = caConfig.TLSCACerts.Client.Key.LoadBytes()
133-
134126
return caConfig.TLSCACerts.Client.Key.Bytes(), err
135127
}
136128

@@ -142,10 +134,6 @@ func (m *exampleCaClientCert) CAClientCert(org string) ([]byte, error) {
142134
return nil, err
143135
}
144136

145-
//subst path
146-
caConfig.TLSCACerts.Client.Cert.Path = pathvar.Subst(caConfig.TLSCACerts.Client.Cert.Path)
147-
err = caConfig.TLSCACerts.Client.Cert.LoadBytes()
148-
149137
return caConfig.TLSCACerts.Client.Cert.Bytes(), err
150138
}
151139

0 commit comments

Comments
 (0)