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