From b7a6d14bdc56e9397be8c9bef9c3d991ff30fe77 Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Mon, 17 Aug 2015 11:37:55 -0700 Subject: [PATCH 1/3] Do not allow corrupted syslog-address Signed-off-by: Alexander Morozov --- daemon/logger/syslog/syslog.go | 52 ++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/daemon/logger/syslog/syslog.go b/daemon/logger/syslog/syslog.go index a402e2619..eb4497754 100644 --- a/daemon/logger/syslog/syslog.go +++ b/daemon/logger/syslog/syslog.go @@ -107,33 +107,35 @@ func (s *syslogger) Name() string { } func parseAddress(address string) (string, string, error) { - if urlutil.IsTransportURL(address) { - url, err := url.Parse(address) - if err != nil { - return "", "", err - } - - // unix socket validation - if url.Scheme == "unix" { - if _, err := os.Stat(url.Path); err != nil { - return "", "", err - } - return url.Scheme, url.Path, nil - } - - // here we process tcp|udp - host := url.Host - if _, _, err := net.SplitHostPort(host); err != nil { - if !strings.Contains(err.Error(), "missing port in address") { - return "", "", err - } - host = host + ":514" - } - - return url.Scheme, host, nil + if address == "" { + return "", "", nil + } + if !urlutil.IsTransportURL(address) { + return "", "", fmt.Errorf("syslog-address should be in form proto://address, got %v", address) + } + url, err := url.Parse(address) + if err != nil { + return "", "", err } - return "", "", nil + // unix socket validation + if url.Scheme == "unix" { + if _, err := os.Stat(url.Path); err != nil { + return "", "", err + } + return url.Scheme, url.Path, nil + } + + // here we process tcp|udp + host := url.Host + if _, _, err := net.SplitHostPort(host); err != nil { + if !strings.Contains(err.Error(), "missing port in address") { + return "", "", err + } + host = host + ":514" + } + + return url.Scheme, host, nil } // ValidateLogOpt looks for syslog specific log options From 960791ba60621ef2b182379e7b237e681b602694 Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Mon, 17 Aug 2015 11:38:37 -0700 Subject: [PATCH 2/3] Check syslog config on daemon start Signed-off-by: Alexander Morozov --- daemon/logger/syslog/syslog.go | 6 ++++++ integration-cli/docker_cli_daemon_test.go | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/daemon/logger/syslog/syslog.go b/daemon/logger/syslog/syslog.go index eb4497754..2af99be38 100644 --- a/daemon/logger/syslog/syslog.go +++ b/daemon/logger/syslog/syslog.go @@ -150,6 +150,12 @@ func ValidateLogOpt(cfg map[string]string) error { return fmt.Errorf("unknown log opt '%s' for syslog log driver", key) } } + if _, _, err := parseAddress(cfg["syslog-address"]); err != nil { + return err + } + if _, err := parseFacility(cfg["syslog-facility"]); err != nil { + return err + } return nil } diff --git a/integration-cli/docker_cli_daemon_test.go b/integration-cli/docker_cli_daemon_test.go index 3b7bd3c1a..f2c93e23e 100644 --- a/integration-cli/docker_cli_daemon_test.go +++ b/integration-cli/docker_cli_daemon_test.go @@ -1550,3 +1550,11 @@ func (s *DockerDaemonSuite) TestDaemonRestartWithContainerWithRestartPolicyAlway c.Assert(err, check.IsNil) c.Assert(strings.TrimSpace(out), check.Equals, id[:12]) } + +func (s *DockerDaemonSuite) TestDaemonCorruptedSyslogAddress(c *check.C) { + c.Assert(s.d.Start("--log-driver=syslog", "--log-opt", "syslog-address=corrupted:1234"), check.NotNil) + runCmd := exec.Command("grep", "Failed to set log opts: syslog-address should be in form proto://address", s.d.LogfileName()) + if out, _, err := runCommandWithOutput(runCmd); err != nil { + c.Fatalf("Expected 'Error starting daemon' message; but doesn't exist in log: %q, err: %v", out, err) + } +} From 3f61002b05794eb5e4262a39e29f8a45c7260ba3 Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Mon, 17 Aug 2015 15:27:44 -0700 Subject: [PATCH 3/3] Fix LogConfig.Config in inspect Also add test for daemon-wide log-opt. Signed-off-by: Alexander Morozov --- daemon/inspect.go | 2 +- integration-cli/docker_cli_daemon_test.go | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/daemon/inspect.go b/daemon/inspect.go index 28fbe2b37..c7318a163 100644 --- a/daemon/inspect.go +++ b/daemon/inspect.go @@ -41,7 +41,7 @@ func (daemon *Daemon) getInspectData(container *Container) (*types.ContainerJSON hostConfig.LogConfig.Type = daemon.defaultLogConfig.Type } - if hostConfig.LogConfig.Config == nil { + if len(hostConfig.LogConfig.Config) == 0 { hostConfig.LogConfig.Config = daemon.defaultLogConfig.Config } diff --git a/integration-cli/docker_cli_daemon_test.go b/integration-cli/docker_cli_daemon_test.go index f2c93e23e..f31823b91 100644 --- a/integration-cli/docker_cli_daemon_test.go +++ b/integration-cli/docker_cli_daemon_test.go @@ -1558,3 +1558,15 @@ func (s *DockerDaemonSuite) TestDaemonCorruptedSyslogAddress(c *check.C) { c.Fatalf("Expected 'Error starting daemon' message; but doesn't exist in log: %q, err: %v", out, err) } } + +func (s *DockerDaemonSuite) TestDaemonWideLogConfig(c *check.C) { + c.Assert(s.d.Start("--log-driver=json-file", "--log-opt=max-size=1k"), check.IsNil) + out, err := s.d.Cmd("run", "-d", "--name=logtest", "busybox", "top") + c.Assert(err, check.IsNil, check.Commentf("Output: %s, err: %v", out, err)) + out, err = s.d.Cmd("inspect", "-f", "{{ .HostConfig.LogConfig.Config }}", "logtest") + c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) + cfg := strings.TrimSpace(out) + if cfg != "map[max-size:1k]" { + c.Fatalf("Unexpected log-opt: %s, expected map[max-size:1k]", cfg) + } +}