Skip to content

Commit 93b9076

Browse files
committed
[FAB-3450] Prevent panic on msg signing
This addresses a missed nil check in the code that https://gerrit.hyperledger.org/r/#/c/10259/ introduced. Change-Id: Ie6a854ce85964d0252f9dcca95374a3bba6d1155 Signed-off-by: Yacov Manevich <[email protected]>
1 parent 307c903 commit 93b9076

File tree

2 files changed

+45
-21
lines changed

2 files changed

+45
-21
lines changed

gossip/discovery/discovery_impl.go

+35-13
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package discovery
1818

1919
import (
2020
"bytes"
21+
"errors"
2122
"fmt"
2223
"math"
2324
"strconv"
@@ -172,7 +173,12 @@ func (d *gossipDiscoveryImpl) Connect(member NetworkMember, id identifier) {
172173
Endpoint: member.Endpoint,
173174
PKIid: id.ID,
174175
}
175-
req, err := d.createMembershipRequest(id.SelfOrg).NoopSign()
176+
m, err := d.createMembershipRequest(id.SelfOrg)
177+
if err != nil {
178+
d.logger.Warning("Failed creating membership request:", err)
179+
continue
180+
}
181+
req, err := m.NoopSign()
176182
if err != nil {
177183
d.logger.Warning("Failed creating SignedGossipMessage:", err)
178184
continue
@@ -234,7 +240,12 @@ func (d *gossipDiscoveryImpl) InitiateSync(peerNum int) {
234240
return
235241
}
236242
var peers2SendTo []*NetworkMember
237-
memReq, err := d.createMembershipRequest(true).NoopSign()
243+
m, err := d.createMembershipRequest(true)
244+
if err != nil {
245+
d.logger.Warning("Failed creating membership request:", err)
246+
return
247+
}
248+
memReq, err := m.NoopSign()
238249
if err != nil {
239250
d.logger.Warning("Failed creating SignedGossipMessage:", err)
240251
return
@@ -409,8 +420,9 @@ func (d *gossipDiscoveryImpl) sendMemResponse(targetMember *proto.Member, intern
409420
InternalEndpoint: internalEndpoint,
410421
}
411422

412-
aliveMsg := d.createAliveMessage(true)
413-
if aliveMsg == nil {
423+
aliveMsg, err := d.createAliveMessage(true)
424+
if err != nil {
425+
d.logger.Warning("Failed creating alive message:", err)
414426
return
415427
}
416428
memResp := d.createMembershipResponse(aliveMsg, targetPeer)
@@ -607,17 +619,26 @@ func (d *gossipDiscoveryImpl) periodicalReconnectToDead() {
607619
}
608620

609621
func (d *gossipDiscoveryImpl) sendMembershipRequest(member *NetworkMember, includeInternalEndpoint bool) {
610-
req, err := d.createMembershipRequest(includeInternalEndpoint).NoopSign()
622+
m, err := d.createMembershipRequest(includeInternalEndpoint)
623+
if err != nil {
624+
d.logger.Warning("Failed creating membership request:", err)
625+
return
626+
}
627+
req, err := m.NoopSign()
611628
if err != nil {
612629
d.logger.Error("Failed creating SignedGossipMessage:", err)
613630
return
614631
}
615632
d.comm.SendToPeer(member, req)
616633
}
617634

618-
func (d *gossipDiscoveryImpl) createMembershipRequest(includeInternalEndpoint bool) *proto.GossipMessage {
635+
func (d *gossipDiscoveryImpl) createMembershipRequest(includeInternalEndpoint bool) (*proto.GossipMessage, error) {
636+
am, err := d.createAliveMessage(includeInternalEndpoint)
637+
if err != nil {
638+
return nil, err
639+
}
619640
req := &proto.MembershipRequest{
620-
SelfInformation: d.createAliveMessage(includeInternalEndpoint).Envelope,
641+
SelfInformation: am.Envelope,
621642
// TODO: sending the known peers is not secure because the remote peer might shouldn't know
622643
// TODO: about the known peers. I'm deprecating this until a secure mechanism will be implemented.
623644
// TODO: See FAB-2570 for tracking this issue.
@@ -629,7 +650,7 @@ func (d *gossipDiscoveryImpl) createMembershipRequest(includeInternalEndpoint bo
629650
Content: &proto.GossipMessage_MemReq{
630651
MemReq: req,
631652
},
632-
}
653+
}, nil
633654
}
634655

635656
func (d *gossipDiscoveryImpl) copyLastSeen(lastSeenMap map[string]*timestamp) []NetworkMember {
@@ -711,15 +732,16 @@ func (d *gossipDiscoveryImpl) periodicalSendAlive() {
711732
for !d.toDie() {
712733
d.logger.Debug("Sleeping", getAliveTimeInterval())
713734
time.Sleep(getAliveTimeInterval())
714-
msg := d.createAliveMessage(true)
715-
if msg == nil {
735+
msg, err := d.createAliveMessage(true)
736+
if err != nil {
737+
d.logger.Warning("Failed creating alive message:", err)
716738
return
717739
}
718740
d.comm.Gossip(msg)
719741
}
720742
}
721743

722-
func (d *gossipDiscoveryImpl) createAliveMessage(includeInternalEndpoint bool) *proto.SignedGossipMessage {
744+
func (d *gossipDiscoveryImpl) createAliveMessage(includeInternalEndpoint bool) (*proto.SignedGossipMessage, error) {
723745
d.lock.Lock()
724746
d.seqNum++
725747
seqNum := d.seqNum
@@ -750,7 +772,7 @@ func (d *gossipDiscoveryImpl) createAliveMessage(includeInternalEndpoint bool) *
750772

751773
envp := d.crypt.SignMessage(msg2Gossip, internalEndpoint)
752774
if envp == nil {
753-
return nil
775+
return nil, errors.New("Failed signing message")
754776
}
755777
signedMsg := &proto.SignedGossipMessage{
756778
GossipMessage: msg2Gossip,
@@ -761,7 +783,7 @@ func (d *gossipDiscoveryImpl) createAliveMessage(includeInternalEndpoint bool) *
761783
signedMsg.Envelope.SecretEnvelope = nil
762784
}
763785

764-
return signedMsg
786+
return signedMsg, nil
765787
}
766788

767789
func (d *gossipDiscoveryImpl) learnExistingMembers(aliveArr []*proto.SignedGossipMessage) {

gossip/discovery/discovery_test.go

+10-8
Original file line numberDiff line numberDiff line change
@@ -413,9 +413,11 @@ func TestConnect(t *testing.T) {
413413
waitUntilOrFail(t, fullMembership)
414414

415415
discInst := instances[rand.Intn(len(instances))].Discovery.(*gossipDiscoveryImpl)
416-
am, _ := discInst.createMembershipRequest(true).GetMemReq().SelfInformation.ToGossipMessage()
416+
mr, _ := discInst.createMembershipRequest(true)
417+
am, _ := mr.GetMemReq().SelfInformation.ToGossipMessage()
417418
assert.NotNil(t, am.SecretEnvelope)
418-
am, _ = discInst.createMembershipRequest(false).GetMemReq().SelfInformation.ToGossipMessage()
419+
mr2, _ := discInst.createMembershipRequest(false)
420+
am, _ = mr2.GetMemReq().SelfInformation.ToGossipMessage()
419421
assert.Nil(t, am.SecretEnvelope)
420422
stopInstances(t, instances)
421423
}
@@ -920,13 +922,13 @@ func TestMsgStoreExpirationWithMembershipMessages(t *testing.T) {
920922

921923
// Creating MembershipRequest messages
922924
for i := 0; i < peersNum; i++ {
923-
memReqMsg := instances[i].discoveryImpl().createMembershipRequest(true)
925+
memReqMsg, _ := instances[i].discoveryImpl().createMembershipRequest(true)
924926
sMsg, _ := memReqMsg.NoopSign()
925927
memReqMsgs = append(memReqMsgs, sMsg)
926928
}
927929
// Creating Alive messages
928930
for i := 0; i < peersNum; i++ {
929-
aliveMsg := instances[i].discoveryImpl().createAliveMessage(true)
931+
aliveMsg, _ := instances[i].discoveryImpl().createAliveMessage(true)
930932
aliveMsgs = append(aliveMsgs, aliveMsg)
931933
}
932934

@@ -989,15 +991,15 @@ func TestMsgStoreExpirationWithMembershipMessages(t *testing.T) {
989991
return k == i
990992
},
991993
func(k int) {
992-
aliveMsg := instances[k].discoveryImpl().createAliveMessage(true)
994+
aliveMsg, _ := instances[k].discoveryImpl().createAliveMessage(true)
993995
memResp := instances[k].discoveryImpl().createMembershipResponse(aliveMsg, peerToResponse)
994996
memRespMsgs[i] = append(memRespMsgs[i], memResp)
995997
})
996998
}
997999

9981000
// Re-creating Alive msgs with highest seq_num, to make sure Alive msgs in memReq and memResp are older
9991001
for i := 0; i < peersNum; i++ {
1000-
aliveMsg := instances[i].discoveryImpl().createAliveMessage(true)
1002+
aliveMsg, _ := instances[i].discoveryImpl().createAliveMessage(true)
10011003
newAliveMsgs = append(newAliveMsgs, aliveMsg)
10021004
}
10031005

@@ -1104,13 +1106,13 @@ func TestAliveMsgStore(t *testing.T) {
11041106

11051107
// Creating MembershipRequest messages
11061108
for i := 0; i < peersNum; i++ {
1107-
memReqMsg := instances[i].discoveryImpl().createMembershipRequest(true)
1109+
memReqMsg, _ := instances[i].discoveryImpl().createMembershipRequest(true)
11081110
sMsg, _ := memReqMsg.NoopSign()
11091111
memReqMsgs = append(memReqMsgs, sMsg)
11101112
}
11111113
// Creating Alive messages
11121114
for i := 0; i < peersNum; i++ {
1113-
aliveMsg := instances[i].discoveryImpl().createAliveMessage(true)
1115+
aliveMsg, _ := instances[i].discoveryImpl().createAliveMessage(true)
11141116
aliveMsgs = append(aliveMsgs, aliveMsg)
11151117
}
11161118

0 commit comments

Comments
 (0)