@cryptotaxi247 / kubo / commits / 03ad3b87f

fix(p2p): issue #5523

License: MIT Signed-off-by: Overbool <overbool.xu@gmail.com>

Overbool committed Sep 27, 2018 at 12:58 UTC 03ad3b87ff8523ae178690b10b1f65e0757bb2de
2 files changed +44 -6
core/commands/p2p.go
+40
@@ -219,6 +219,12 @@ Example:
219 return
220 }
221
222 + // port can't be 0
223 + if err := checkPort(target); err != nil {
224 + res.SetError(err, cmdkit.ErrNormal)
225 + return
226 + }
227 +
228 allowCustom, _, err := req.Option(allowCustomProtocolOptionName).Bool()
229 if err != nil {
230 res.SetError(err, cmdkit.ErrNormal)
@@ -239,6 +245,40 @@ Example:
245 },
246 }
247
248 +// checkPort checks whether target multiaddr contains tcp or udp protocol
249 +// and whether the port is equal to 0
250 +func checkPort(target ma.Multiaddr) error {
251 + // get tcp or udp port from multiaddr
252 + getPort := func() (string, error) {
253 + sport, _ := target.ValueForProtocol(ma.P_TCP)
254 + if sport != "" {
255 + return sport, nil
256 + }
257 +
258 + sport, _ = target.ValueForProtocol(ma.P_UDP)
259 + if sport != "" {
260 + return sport, nil
261 + }
262 + return "", fmt.Errorf("address does not contain tcp or udp protocol")
263 + }
264 +
265 + sport, err := getPort()
266 + if err != nil {
267 + return err
268 + }
269 +
270 + port, err := strconv.Atoi(sport)
271 + if err != nil {
272 + return err
273 + }
274 +
275 + if port == 0 {
276 + return fmt.Errorf("port can't be 0")
277 + }
278 +
279 + return nil
280 +}
281 +
282 // forwardRemote forwards libp2p service connections to a manet address
283 func forwardRemote(ctx context.Context, p *p2p.P2P, proto protocol.ID, target ma.Multiaddr) error {
284 // TODO: return some info
p2p/local.go
+4 -6
@@ -28,21 +28,19 @@ type localListener struct {
28 // ForwardLocal creates new P2P stream to a remote listener
29 func (p2p *P2P) ForwardLocal(ctx context.Context, peer peer.ID, proto protocol.ID, bindAddr ma.Multiaddr) (Listener, error) {
30 listener := &localListener{
31 - ctx: ctx,
32 -
33 - p2p: p2p,
34 -
31 + ctx: ctx,
32 + p2p: p2p,
33 proto: proto,
36 - laddr: bindAddr,
34 peer: peer,
35 }
36
40 - maListener, err := manet.Listen(listener.laddr)
37 + maListener, err := manet.Listen(bindAddr)
38 if err != nil {
39 return nil, err
40 }
41
42 listener.listener = maListener
43 + listener.laddr = maListener.Multiaddr()
44
45 if err := p2p.ListenersLocal.Register(listener); err != nil {
46 return nil, err