Skip to content

Commit dd4d8bb

Browse files
authored
Merge pull request ipfs#5529 from overbool/fix/issue-#5523
fix(p2p): issue ipfs#5523
2 parents f6c6327 + 717c0c8 commit dd4d8bb

File tree

3 files changed

+64
-8
lines changed

3 files changed

+64
-8
lines changed

core/commands/p2p.go

+40
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,12 @@ Example:
215215
return
216216
}
217217

218+
// port can't be 0
219+
if err := checkPort(target); err != nil {
220+
res.SetError(err, cmdkit.ErrNormal)
221+
return
222+
}
223+
218224
allowCustom, _, err := req.Option(allowCustomProtocolOptionName).Bool()
219225
if err != nil {
220226
res.SetError(err, cmdkit.ErrNormal)
@@ -235,6 +241,40 @@ Example:
235241
},
236242
}
237243

244+
// checkPort checks whether target multiaddr contains tcp or udp protocol
245+
// and whether the port is equal to 0
246+
func checkPort(target ma.Multiaddr) error {
247+
// get tcp or udp port from multiaddr
248+
getPort := func() (string, error) {
249+
sport, _ := target.ValueForProtocol(ma.P_TCP)
250+
if sport != "" {
251+
return sport, nil
252+
}
253+
254+
sport, _ = target.ValueForProtocol(ma.P_UDP)
255+
if sport != "" {
256+
return sport, nil
257+
}
258+
return "", fmt.Errorf("address does not contain tcp or udp protocol")
259+
}
260+
261+
sport, err := getPort()
262+
if err != nil {
263+
return err
264+
}
265+
266+
port, err := strconv.Atoi(sport)
267+
if err != nil {
268+
return err
269+
}
270+
271+
if port == 0 {
272+
return fmt.Errorf("port can not be 0")
273+
}
274+
275+
return nil
276+
}
277+
238278
// forwardRemote forwards libp2p service connections to a manet address
239279
func forwardRemote(ctx context.Context, p *p2p.P2P, proto protocol.ID, target ma.Multiaddr) error {
240280
// TODO: return some info

p2p/local.go

+4-6
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,19 @@ type localListener struct {
2828
// ForwardLocal creates new P2P stream to a remote listener
2929
func (p2p *P2P) ForwardLocal(ctx context.Context, peer peer.ID, proto protocol.ID, bindAddr ma.Multiaddr) (Listener, error) {
3030
listener := &localListener{
31-
ctx: ctx,
32-
33-
p2p: p2p,
34-
31+
ctx: ctx,
32+
p2p: p2p,
3533
proto: proto,
36-
laddr: bindAddr,
3734
peer: peer,
3835
}
3936

40-
maListener, err := manet.Listen(listener.laddr)
37+
maListener, err := manet.Listen(bindAddr)
4138
if err != nil {
4239
return nil, err
4340
}
4441

4542
listener.listener = maListener
43+
listener.laddr = maListener.Multiaddr()
4644

4745
if err := p2p.ListenersLocal.Register(listener); err != nil {
4846
return nil, err

test/sharness/t0180-p2p.sh

+20-2
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ test_description="Test experimental p2p commands"
66

77
# start iptb + wait for peering
88
test_expect_success 'init iptb' '
9-
iptb init -n 2 --bootstrap=none --port=0
9+
iptb init -n 3 --bootstrap=none --port=0
1010
'
1111

1212
test_expect_success 'generate test data' '
1313
echo "ABCDEF" > test0.bin &&
1414
echo "012345" > test1.bin
1515
'
1616

17-
startup_cluster 2
17+
startup_cluster 3
1818

1919
test_expect_success 'peer ids' '
2020
PEERID_0=$(iptb get id 0) &&
@@ -37,6 +37,7 @@ test_expect_success 'fail without config option being enabled' '
3737
test_expect_success "enable filestore config setting" '
3838
ipfsi 0 config --json Experimental.Libp2pStreamMounting true
3939
ipfsi 1 config --json Experimental.Libp2pStreamMounting true
40+
ipfsi 2 config --json Experimental.Libp2pStreamMounting true
4041
'
4142

4243
test_expect_success 'start p2p listener' '
@@ -147,6 +148,23 @@ test_expect_success 'C->S Close local listener' '
147148

148149
check_test_ports
149150

151+
# Checking port
152+
153+
test_expect_success "cannot accept 0 port in 'ipfs p2p listen'" '
154+
test_must_fail ipfsi 2 p2p listen /x/p2p-test/0 /ip4/127.0.0.1/tcp/0
155+
'
156+
157+
test_expect_success "'ipfs p2p forward' accept 0 port" '
158+
ipfsi 2 p2p forward /x/p2p-test/0 /ip4/127.0.0.1/tcp/0 /ipfs/$PEERID_0
159+
'
160+
161+
test_expect_success "'ipfs p2p ls' output looks good" '
162+
echo "true" > forward_0_expected &&
163+
ipfsi 2 p2p ls | awk '\''{print $2}'\'' | sed "s/.*\///" | awk -F: '\''{if($1>0)print"true"}'\'' > forward_0_actual &&
164+
ipfsi 2 p2p close -p /x/p2p-test/0 &&
165+
test_cmp forward_0_expected forward_0_actual
166+
'
167+
150168
# Listing streams
151169

152170
test_expect_success "'ipfs p2p ls' succeeds" '

0 commit comments

Comments
 (0)