forked from cerc-io/plugeth
p2p/protocols: fix rare data race in Peer.Handshake() (#18951)
This commit is contained in:
parent
e9daed189e
commit
a0ac3b6a1a
@ -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…
Reference in New Issue
Block a user