From 8fe7465f67867fbd1380e690a424842bc3ba9133 Mon Sep 17 00:00:00 2001 From: Overbool Date: Thu, 27 Sep 2018 12:58:59 +0800 Subject: [PATCH] fix(p2p): issue #5523 License: MIT Signed-off-by: Overbool --- core/commands/p2p.go | 39 +++++++++++++++++++++++++++++++++++++++ p2p/local.go | 6 ++---- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/core/commands/p2p.go b/core/commands/p2p.go index 0877bd44b637..5629d48d18e9 100644 --- a/core/commands/p2p.go +++ b/core/commands/p2p.go @@ -176,6 +176,12 @@ Example: return } + // port can't be 0 + if err := checkPort(target); err != nil { + res.SetError(err, cmdkit.ErrNormal) + return + } + allowCustom, _, err := req.Option("allow-custom-protocol").Bool() if err != nil { res.SetError(err, cmdkit.ErrNormal) @@ -196,6 +202,39 @@ Example: }, } +// checkPort checks whether target multiaddr contains tcp or udp protocol +// and whether the port is equal to 0 +func checkPort(target ma.Multiaddr) error { + addr := target.String() + var sport string + if strings.Contains(addr, "tcp") { + s, err := target.ValueForProtocol(ma.P_TCP) + if err != nil { + return err + } + sport = s + } else if strings.Contains(addr ,"udp") { + s, err := target.ValueForProtocol(ma.P_UDP) + if err != nil { + return err + } + sport = s + } else { + return fmt.Errorf("address does not contain tcp or udp protocol") + } + + port, err := strconv.Atoi(sport) + if err != nil { + return err + } + + if port == 0 { + return fmt.Errorf("port can't be 0") + } + + return nil +} + // forwardRemote forwards libp2p service connections to a manet address func forwardRemote(ctx context.Context, p *p2p.P2P, proto protocol.ID, target ma.Multiaddr) error { // TODO: return some info diff --git a/p2p/local.go b/p2p/local.go index 381156691373..31c77f5bbd26 100644 --- a/p2p/local.go +++ b/p2p/local.go @@ -29,20 +29,18 @@ type localListener struct { func (p2p *P2P) ForwardLocal(ctx context.Context, peer peer.ID, proto protocol.ID, bindAddr ma.Multiaddr) (Listener, error) { listener := &localListener{ ctx: ctx, - p2p: p2p, - proto: proto, - laddr: bindAddr, peer: peer, } - maListener, err := manet.Listen(listener.laddr) + maListener, err := manet.Listen(bindAddr) if err != nil { return nil, err } listener.listener = maListener + listener.laddr = maListener.Multiaddr() if err := p2p.ListenersLocal.Register(listener); err != nil { return nil, err