vendor go-connections to error out if unix socket path is too long

Signed-off-by: Tibor Vass <tibor@docker.com>
This commit is contained in:
Tibor Vass 2016-11-15 11:11:24 -08:00
parent a08ffa0e93
commit e2e7ab655f
4 changed files with 41 additions and 11 deletions

View file

@ -17,7 +17,7 @@ github.com/vdemeester/shakers 24d7f1d6a71aa5d9cbe7390e4afb66b7eef9e1b3
golang.org/x/net 2beffdc2e92c8a3027590f898fe88f69af48a3f8 https://github.com/tonistiigi/net.git golang.org/x/net 2beffdc2e92c8a3027590f898fe88f69af48a3f8 https://github.com/tonistiigi/net.git
golang.org/x/sys 8f0908ab3b2457e2e15403d3697c9ef5cb4b57a9 golang.org/x/sys 8f0908ab3b2457e2e15403d3697c9ef5cb4b57a9
github.com/docker/go-units 8a7beacffa3009a9ac66bad506b18ffdd110cf97 github.com/docker/go-units 8a7beacffa3009a9ac66bad506b18ffdd110cf97
github.com/docker/go-connections f512407a188ecb16f31a33dbc9c4e4814afc1b03 github.com/docker/go-connections 4ccf312bf1d35e5dbda654e57a9be4c3f3cd0366
github.com/RackSec/srslog 456df3a81436d29ba874f3590eeeee25d666f8a5 github.com/RackSec/srslog 456df3a81436d29ba874f3590eeeee25d666f8a5
github.com/imdario/mergo 0.2.1 github.com/imdario/mergo 0.2.1

View file

@ -2,6 +2,7 @@
package sockets package sockets
import ( import (
"errors"
"net" "net"
"net/http" "net/http"
"time" "time"
@ -10,6 +11,9 @@ import (
// Why 32? See https://github.com/docker/docker/pull/8035. // Why 32? See https://github.com/docker/docker/pull/8035.
const defaultTimeout = 32 * time.Second const defaultTimeout = 32 * time.Second
// ErrProtocolNotAvailable is returned when a given transport protocol is not provided by the operating system.
var ErrProtocolNotAvailable = errors.New("protocol not available")
// ConfigureTransport configures the specified Transport according to the // ConfigureTransport configures the specified Transport according to the
// specified proto and addr. // specified proto and addr.
// If the proto is unix (using a unix socket to communicate) or npipe the // If the proto is unix (using a unix socket to communicate) or npipe the
@ -17,17 +21,9 @@ const defaultTimeout = 32 * time.Second
func ConfigureTransport(tr *http.Transport, proto, addr string) error { func ConfigureTransport(tr *http.Transport, proto, addr string) error {
switch proto { switch proto {
case "unix": case "unix":
// No need for compression in local communications. return configureUnixTransport(tr, proto, addr)
tr.DisableCompression = true
tr.Dial = func(_, _ string) (net.Conn, error) {
return net.DialTimeout(proto, addr, defaultTimeout)
}
case "npipe": case "npipe":
// No need for compression in local communications. return configureNpipeTransport(tr, proto, addr)
tr.DisableCompression = true
tr.Dial = func(_, _ string) (net.Conn, error) {
return DialPipe(addr, defaultTimeout)
}
default: default:
tr.Proxy = http.ProxyFromEnvironment tr.Proxy = http.ProxyFromEnvironment
dialer, err := DialerFromEnvironment(&net.Dialer{ dialer, err := DialerFromEnvironment(&net.Dialer{

View file

@ -3,11 +3,31 @@
package sockets package sockets
import ( import (
"fmt"
"net" "net"
"net/http"
"syscall" "syscall"
"time" "time"
) )
const maxUnixSocketPathSize = len(syscall.RawSockaddrUnix{}.Path)
func configureUnixTransport(tr *http.Transport, proto, addr string) error {
if len(addr) > maxUnixSocketPathSize {
return fmt.Errorf("Unix socket path %q is too long", addr)
}
// No need for compression in local communications.
tr.DisableCompression = true
tr.Dial = func(_, _ string) (net.Conn, error) {
return net.DialTimeout(proto, addr, defaultTimeout)
}
return nil
}
func configureNpipeTransport(tr *http.Transport, proto, addr string) error {
return ErrProtocolNotAvailable
}
// DialPipe connects to a Windows named pipe. // DialPipe connects to a Windows named pipe.
// This is not supported on other OSes. // This is not supported on other OSes.
func DialPipe(_ string, _ time.Duration) (net.Conn, error) { func DialPipe(_ string, _ time.Duration) (net.Conn, error) {

View file

@ -2,11 +2,25 @@ package sockets
import ( import (
"net" "net"
"net/http"
"time" "time"
"github.com/Microsoft/go-winio" "github.com/Microsoft/go-winio"
) )
func configureUnixTransport(tr *http.Transport, proto, addr string) error {
return ErrProtocolNotAvailable
}
func configureNpipeTransport(tr *http.Transport, proto, addr string) error {
// No need for compression in local communications.
tr.DisableCompression = true
tr.Dial = func(_, _ string) (net.Conn, error) {
return DialPipe(addr, defaultTimeout)
}
return nil
}
// DialPipe connects to a Windows named pipe. // DialPipe connects to a Windows named pipe.
func DialPipe(addr string, timeout time.Duration) (net.Conn, error) { func DialPipe(addr string, timeout time.Duration) (net.Conn, error) {
return winio.DialPipe(addr, &timeout) return winio.DialPipe(addr, &timeout)