p2p/protocols: fix rare data race in Peer.Handshake() (#18951)

pull/17439/head
Ferenc Szabo 6 years ago committed by Anton Evangelatov
parent e9daed189e
commit a0ac3b6a1a
  1. 5
      p2p/protocols/protocol.go

@ -386,10 +386,12 @@ func (p *Peer) handleIncoming(handle func(ctx context.Context, msg interface{})
// * the dialing peer needs to send the handshake first and then waits for remote // * the dialing peer needs to send the handshake first and then waits for remote
// * the listening peer waits for the remote handshake and then sends it // * the listening peer waits for the remote handshake and then sends it
// returns the remote handshake and an error // returns the remote handshake and an error
func (p *Peer) Handshake(ctx context.Context, hs interface{}, verify func(interface{}) error) (rhs interface{}, err error) { func (p *Peer) Handshake(ctx context.Context, hs interface{}, verify func(interface{}) error) (interface{}, error) {
if _, ok := p.spec.GetCode(hs); !ok { if _, ok := p.spec.GetCode(hs); !ok {
return nil, errorf(ErrHandshake, "unknown handshake message type: %T", hs) return nil, errorf(ErrHandshake, "unknown handshake message type: %T", hs)
} }
var rhs interface{}
errc := make(chan error, 2) errc := make(chan error, 2)
handle := func(ctx context.Context, msg interface{}) error { handle := func(ctx context.Context, msg interface{}) error {
rhs = msg rhs = msg
@ -412,6 +414,7 @@ func (p *Peer) Handshake(ctx context.Context, hs interface{}, verify func(interf
}() }()
for i := 0; i < 2; i++ { for i := 0; i < 2; i++ {
var err error
select { select {
case err = <-errc: case err = <-errc:
case <-ctx.Done(): case <-ctx.Done():

Loading…
Cancel
Save