mirror of
https://github.com/minio/minio.git
synced 2024-12-26 07:05:55 -05:00
fix: allow bind on ipv6 loopback failures (#16388)
This commit is contained in:
parent
1ece3d1dfe
commit
9815dac48f
@ -21,6 +21,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -136,20 +137,49 @@ func newHTTPListener(ctx context.Context, serverAddrs []string) (listener *httpL
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
isLocalhost := false
|
||||||
|
for _, serverAddr := range serverAddrs {
|
||||||
|
host, _, err := net.SplitHostPort(serverAddr)
|
||||||
|
if err == nil {
|
||||||
|
if strings.EqualFold(host, "localhost") {
|
||||||
|
isLocalhost = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Silently ignore failure to bind on DNS cached ipv6 loopback iff user specifies "localhost"
|
||||||
for _, serverAddr := range serverAddrs {
|
for _, serverAddr := range serverAddrs {
|
||||||
var l net.Listener
|
var l net.Listener
|
||||||
if l, err = listenCfg.Listen(ctx, "tcp", serverAddr); err != nil {
|
if l, err = listenCfg.Listen(ctx, "tcp", serverAddr); err != nil {
|
||||||
|
if isLocalhost && strings.HasPrefix(serverAddr, "[::1]") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
tcpListener, ok := l.(*net.TCPListener)
|
tcpListener, ok := l.(*net.TCPListener)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("unexpected listener type found %v, expected net.TCPListener", l)
|
err = fmt.Errorf("unexpected listener type found %v, expected net.TCPListener", l)
|
||||||
|
if isLocalhost && strings.HasPrefix(serverAddr, "[::1]") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
tcpListeners = append(tcpListeners, tcpListener)
|
tcpListeners = append(tcpListeners, tcpListener)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fail if no listeners found
|
||||||
|
if len(tcpListeners) == 0 {
|
||||||
|
// Report specific issue
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// Report general issue
|
||||||
|
err = fmt.Errorf("%v listeners found, expected at least 1", 0)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
listener = &httpListener{
|
listener = &httpListener{
|
||||||
tcpListeners: tcpListeners,
|
tcpListeners: tcpListeners,
|
||||||
acceptCh: make(chan acceptResult, len(tcpListeners)),
|
acceptCh: make(chan acceptResult, len(tcpListeners)),
|
||||||
|
@ -142,17 +142,18 @@ func TestNewHTTPListener(t *testing.T) {
|
|||||||
{[]string{"example.org:65432"}, time.Duration(0), time.Duration(0), time.Duration(0), true},
|
{[]string{"example.org:65432"}, time.Duration(0), time.Duration(0), time.Duration(0), true},
|
||||||
{[]string{"unknown-host"}, time.Duration(0), time.Duration(0), time.Duration(0), true},
|
{[]string{"unknown-host"}, time.Duration(0), time.Duration(0), time.Duration(0), true},
|
||||||
{[]string{"unknown-host:65432"}, time.Duration(0), time.Duration(0), time.Duration(0), true},
|
{[]string{"unknown-host:65432"}, time.Duration(0), time.Duration(0), time.Duration(0), true},
|
||||||
|
{[]string{"localhost:65432"}, time.Duration(0), time.Duration(0), time.Duration(0), false},
|
||||||
{[]string{"localhost:65432", "93.184.216.34:65432"}, time.Duration(0), time.Duration(0), time.Duration(0), true},
|
{[]string{"localhost:65432", "93.184.216.34:65432"}, time.Duration(0), time.Duration(0), time.Duration(0), true},
|
||||||
{[]string{"localhost:65432", "unknown-host:65432"}, time.Duration(0), time.Duration(0), time.Duration(0), true},
|
{[]string{"localhost:65432", "unknown-host:65432"}, time.Duration(0), time.Duration(0), time.Duration(0), true},
|
||||||
{[]string{"localhost:0"}, time.Duration(0), time.Duration(0), time.Duration(0), false},
|
{[]string{"localhost:0"}, time.Duration(0), time.Duration(0), time.Duration(0), false},
|
||||||
{[]string{"localhost:0"}, time.Duration(0), time.Duration(0), time.Duration(0), false},
|
{[]string{"localhost:0"}, time.Duration(0), time.Duration(0), time.Duration(0), false},
|
||||||
|
{[]string{"[::1]:9090", "localhost:0"}, time.Duration(0), time.Duration(0), time.Duration(0), false},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, testCase := range testCases {
|
for _, testCase := range testCases {
|
||||||
listener, err := newHTTPListener(context.Background(),
|
listener, err := newHTTPListener(context.Background(),
|
||||||
testCase.serverAddrs,
|
testCase.serverAddrs,
|
||||||
)
|
)
|
||||||
|
|
||||||
if !testCase.expectedErr {
|
if !testCase.expectedErr {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("error: expected = <nil>, got = %v", err)
|
t.Fatalf("error: expected = <nil>, got = %v", err)
|
||||||
|
Loading…
Reference in New Issue
Block a user