mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-21 10:27:46 +08:00
fix(p2p): issue #5523
License: MIT Signed-off-by: Overbool <overbool.xu@gmail.com>
This commit is contained in:
parent
ab9e211bc3
commit
03ad3b87ff
@ -219,6 +219,12 @@ Example:
|
||||
return
|
||||
}
|
||||
|
||||
// port can't be 0
|
||||
if err := checkPort(target); err != nil {
|
||||
res.SetError(err, cmdkit.ErrNormal)
|
||||
return
|
||||
}
|
||||
|
||||
allowCustom, _, err := req.Option(allowCustomProtocolOptionName).Bool()
|
||||
if err != nil {
|
||||
res.SetError(err, cmdkit.ErrNormal)
|
||||
@ -239,6 +245,40 @@ 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 {
|
||||
// get tcp or udp port from multiaddr
|
||||
getPort := func() (string, error) {
|
||||
sport, _ := target.ValueForProtocol(ma.P_TCP)
|
||||
if sport != "" {
|
||||
return sport, nil
|
||||
}
|
||||
|
||||
sport, _ = target.ValueForProtocol(ma.P_UDP)
|
||||
if sport != "" {
|
||||
return sport, nil
|
||||
}
|
||||
return "", fmt.Errorf("address does not contain tcp or udp protocol")
|
||||
}
|
||||
|
||||
sport, err := getPort()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
10
p2p/local.go
10
p2p/local.go
@ -28,21 +28,19 @@ type localListener struct {
|
||||
// ForwardLocal creates new P2P stream to a remote listener
|
||||
func (p2p *P2P) ForwardLocal(ctx context.Context, peer peer.ID, proto protocol.ID, bindAddr ma.Multiaddr) (Listener, error) {
|
||||
listener := &localListener{
|
||||
ctx: ctx,
|
||||
|
||||
p2p: p2p,
|
||||
|
||||
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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user