pb: fix IPv6 double brackets in ServerAddress formatting (#8329)

* pb: fix IPv6 double brackets in ServerAddress formatting

* pb: refactor IPv6 tests into table-driven test

* util: add JoinHostPortStr and use it in pb to avoid unsafe port parsing
This commit is contained in:
Chris Lu
2026-02-12 18:11:03 -08:00
committed by GitHub
parent 796f23f68a
commit 1e4f30c56f
3 changed files with 41 additions and 5 deletions

View File

@@ -57,7 +57,7 @@ func (sa ServerAddress) ToHttpAddress() string {
sepIndex := strings.LastIndex(string(ports), ".")
if sepIndex >= 0 {
host := string(sa[0:portsSepIndex])
return net.JoinHostPort(host, ports[0:sepIndex])
return util.JoinHostPortStr(host, ports[0:sepIndex])
}
return string(sa)
}
@@ -74,7 +74,7 @@ func (sa ServerAddress) ToGrpcAddress() string {
sepIndex := strings.LastIndex(ports, ".")
if sepIndex >= 0 {
host := string(sa[0:portsSepIndex])
return net.JoinHostPort(host, ports[sepIndex+1:])
return util.JoinHostPortStr(host, ports[sepIndex+1:])
}
return ServerToGrpcAddress(string(sa))
}

View File

@@ -34,3 +34,36 @@ func TestServerAddresses_ToAddressMapOrSrv_shouldHandleIPPortList(t *testing.T)
t.Fatalf(`Expected %q, got %q`, expected, d.list)
}
}
func TestIPv6ServerAddressFormatting(t *testing.T) {
testCases := []struct {
name string
sa ServerAddress
expectedHttp string
expectedGrpc string
}{
{
name: "unbracketed IPv6",
sa: NewServerAddress("2001:db8::1", 8080, 18080),
expectedHttp: "[2001:db8::1]:8080",
expectedGrpc: "[2001:db8::1]:18080",
},
{
name: "bracketed IPv6",
sa: NewServerAddressWithGrpcPort("[2001:db8::1]:8080", 18080),
expectedHttp: "[2001:db8::1]:8080",
expectedGrpc: "[2001:db8::1]:18080",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
if httpAddr := tc.sa.ToHttpAddress(); httpAddr != tc.expectedHttp {
t.Errorf("%s: ToHttpAddress() = %s, want %s", tc.name, httpAddr, tc.expectedHttp)
}
if grpcAddr := tc.sa.ToGrpcAddress(); grpcAddr != tc.expectedGrpc {
t.Errorf("%s: ToGrpcAddress() = %s, want %s", tc.name, grpcAddr, tc.expectedGrpc)
}
})
}
}

View File

@@ -58,11 +58,14 @@ func selectIpV4(netInterfaces []net.Interface, isIpV4 bool) string {
}
func JoinHostPort(host string, port int) string {
portStr := strconv.Itoa(port)
return JoinHostPortStr(host, strconv.Itoa(port))
}
func JoinHostPortStr(host string, port string) string {
if strings.HasPrefix(host, "[") && strings.HasSuffix(host, "]") {
return host + ":" + portStr
return host + ":" + port
}
return net.JoinHostPort(host, portStr)
return net.JoinHostPort(host, port)
}
// GetVolumeServerId returns the volume server ID.