Skip to content

Commit c769a47

Browse files
fhs0intro
authored andcommitted
net: correct address when listening on IPv4zero tcp4/udp4 on Plan 9
Since Plan 9 doesn't allow us to listen on 0.0.0.0, the Listener address that's read in from /net is the IPv6 address ::. Convert this address to 0.0.0.0 when the network is tcp4 or udp4. Fixes #40045 Change-Id: Icfb69b823e5b80603742d23c3762a812996fe43f Reviewed-on: https://go-review.googlesource.com/c/go/+/240918 Run-TryBot: David du Colombier <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: David du Colombier <[email protected]>
1 parent 12debf4 commit c769a47

File tree

2 files changed

+42
-7
lines changed

2 files changed

+42
-7
lines changed

src/net/ipsock_plan9.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func parsePlan9Addr(s string) (ip IP, iport int, err error) {
6767
return addr, p, nil
6868
}
6969

70-
func readPlan9Addr(proto, filename string) (addr Addr, err error) {
70+
func readPlan9Addr(net, filename string) (addr Addr, err error) {
7171
var buf [128]byte
7272

7373
f, err := os.Open(filename)
@@ -83,13 +83,19 @@ func readPlan9Addr(proto, filename string) (addr Addr, err error) {
8383
if err != nil {
8484
return
8585
}
86-
switch proto {
87-
case "tcp":
86+
switch net {
87+
case "tcp4", "udp4":
88+
if ip.Equal(IPv6zero) {
89+
ip = ip[:IPv4len]
90+
}
91+
}
92+
switch net {
93+
case "tcp", "tcp4", "tcp6":
8894
addr = &TCPAddr{IP: ip, Port: port}
89-
case "udp":
95+
case "udp", "udp4", "udp6":
9096
addr = &UDPAddr{IP: ip, Port: port}
9197
default:
92-
return nil, UnknownNetworkError(proto)
98+
return nil, UnknownNetworkError(net)
9399
}
94100
return addr, nil
95101
}
@@ -213,7 +219,7 @@ func dialPlan9Blocking(ctx context.Context, net string, laddr, raddr Addr) (fd *
213219
f.Close()
214220
return nil, err
215221
}
216-
laddr, err = readPlan9Addr(proto, netdir+"/"+proto+"/"+name+"/local")
222+
laddr, err = readPlan9Addr(net, netdir+"/"+proto+"/"+name+"/local")
217223
if err != nil {
218224
data.Close()
219225
f.Close()
@@ -233,7 +239,7 @@ func listenPlan9(ctx context.Context, net string, laddr Addr) (fd *netFD, err er
233239
f.Close()
234240
return nil, &OpError{Op: "announce", Net: net, Source: laddr, Addr: nil, Err: err}
235241
}
236-
laddr, err = readPlan9Addr(proto, netdir+"/"+proto+"/"+name+"/local")
242+
laddr, err = readPlan9Addr(net, netdir+"/"+proto+"/"+name+"/local")
237243
if err != nil {
238244
f.Close()
239245
return nil, err

src/net/ipsock_plan9_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright 2020 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package net
6+
7+
import "testing"
8+
9+
func TestTCP4ListenZero(t *testing.T) {
10+
l, err := Listen("tcp4", "0.0.0.0:0")
11+
if err != nil {
12+
t.Fatal(err)
13+
}
14+
defer l.Close()
15+
if a := l.Addr(); isNotIPv4(a) {
16+
t.Errorf("address does not contain IPv4: %v", a)
17+
}
18+
}
19+
20+
func TestUDP4ListenZero(t *testing.T) {
21+
c, err := ListenPacket("udp4", "0.0.0.0:0")
22+
if err != nil {
23+
t.Fatal(err)
24+
}
25+
defer c.Close()
26+
if a := c.LocalAddr(); isNotIPv4(a) {
27+
t.Errorf("address does not contain IPv4: %v", a)
28+
}
29+
}

0 commit comments

Comments
 (0)