[lxc-devel] [lxd/master] dnsmasq version check fix with different locales
tomponline on Github
lxc-bot at linuxcontainers.org
Thu Aug 22 09:23:45 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 754 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190822/2fefa8c3/attachment.bin>
-------------- next part --------------
From ae56266e6b4a22c2b6873f7d244e5b729349fac3 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 22 Aug 2019 10:14:05 +0100
Subject: [PATCH 1/5] container/lxc: Updates use of shared.RunCommandSplit
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxd/container_lxc.go | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index 6df108d6b5..95397799eb 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -5968,6 +5968,7 @@ func (c *containerLXC) FileExists(path string) error {
// Check if the file exists in the container
_, stderr, err := shared.RunCommandSplit(
+ nil,
c.state.OS.ExecPath,
"forkfile",
"exists",
@@ -6015,6 +6016,7 @@ func (c *containerLXC) FilePull(srcpath string, dstpath string) (int64, int64, o
// Get the file from the container
_, stderr, err := shared.RunCommandSplit(
+ nil,
c.state.OS.ExecPath,
"forkfile",
"pull",
@@ -6159,6 +6161,7 @@ func (c *containerLXC) FilePush(type_ string, srcpath string, dstpath string, ui
// Push the file to the container
_, stderr, err := shared.RunCommandSplit(
+ nil,
c.state.OS.ExecPath,
"forkfile",
"push",
@@ -6228,6 +6231,7 @@ func (c *containerLXC) FileRemove(path string) error {
// Remove the file from the container
_, stderr, err := shared.RunCommandSplit(
+ nil,
c.state.OS.ExecPath,
"forkfile",
"remove",
From 0d6181e6fb16dcd90399bf79bd99c541ca4a9c28 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 22 Aug 2019 10:15:21 +0100
Subject: [PATCH 2/5] dnsmasq/dnsmasq: Updates version check to use
shared.RunCommandCLocale
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxd/dnsmasq/dnsmasq.go | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/lxd/dnsmasq/dnsmasq.go b/lxd/dnsmasq/dnsmasq.go
index b173bba61e..b72dd92966 100644
--- a/lxd/dnsmasq/dnsmasq.go
+++ b/lxd/dnsmasq/dnsmasq.go
@@ -6,7 +6,6 @@ import (
"io/ioutil"
"net"
"os"
- "os/exec"
"path/filepath"
"strconv"
"strings"
@@ -155,8 +154,7 @@ func Kill(name string, reload bool) error {
// GetVersion returns the version of dnsmasq.
func GetVersion() (*version.DottedVersion, error) {
- // Discard stderr on purpose (occasional linker errors)
- output, err := exec.Command("dnsmasq", "--version").Output()
+ output, err := shared.RunCommandCLocale("dnsmasq", "--version")
if err != nil {
return nil, fmt.Errorf("Failed to check dnsmasq version: %v", err)
}
From d4821614048d508ef839f0efa336576f2797f795 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 22 Aug 2019 10:16:15 +0100
Subject: [PATCH 3/5] networks: Handles error from dnsmasq version check
Fixes #6109
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxd/networks.go | 3 +++
1 file changed, 3 insertions(+)
diff --git a/lxd/networks.go b/lxd/networks.go
index 9fa46146c5..c8cd30d736 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -1292,6 +1292,9 @@ func (n *network) Start() error {
fmt.Sprintf("--interface=%s", n.name)}
dnsmasqVersion, err := dnsmasq.GetVersion()
+ if err != nil {
+ return err
+ }
// --dhcp-rapid-commit option is only supported on >2.79
minVer, _ := version.NewDottedVersion("2.79")
From 85023db6858bcb68b0983e08b4e321c436aba010 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 22 Aug 2019 10:17:03 +0100
Subject: [PATCH 4/5] seccomp: Updates use of shared.RunCommandSplit
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxd/seccomp.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lxd/seccomp.go b/lxd/seccomp.go
index c24332789a..05221cab9e 100644
--- a/lxd/seccomp.go
+++ b/lxd/seccomp.go
@@ -826,7 +826,7 @@ func CallForkmknod(c container, dev config.Device, requestPID int) int {
dev["hostpath"] = filepath.Join(c.RootfsPath(), rootPath, dev["path"])
}
- _, stderr, err := shared.RunCommandSplit(util.GetExecPath(),
+ _, stderr, err := shared.RunCommandSplit(nil, util.GetExecPath(),
"forksyscall", "mknod", dev["pid"], dev["path"],
dev["mode_t"], dev["dev_t"], dev["hostpath"],
fmt.Sprintf("%d", uid), fmt.Sprintf("%d", gid),
@@ -1030,7 +1030,7 @@ func (s *SeccompServer) HandleSetxattrSyscall(c container, siov *SeccompIovec) i
whiteout = 1
}
- _, stderr, err := shared.RunCommandSplit(util.GetExecPath(),
+ _, stderr, err := shared.RunCommandSplit(nil, util.GetExecPath(),
"forksyscall",
"setxattr",
fmt.Sprintf("%d", args.pid),
From 894206eed303070967ca2aab74caea06acd7bb31 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 22 Aug 2019 10:17:26 +0100
Subject: [PATCH 5/5] shared/util: Adds RunCommandCLocale() and updates
RunCommandSplit() to accept env vars
RunCommandCLocale() calls RunCommandSplit() with an appended environment var of using LANG=C.UTF-8 to avoid issues when comparing dnsmasq version numbers in non-english locales.
Fixes #6109
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
shared/util.go | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/shared/util.go b/shared/util.go
index a861be1647..ed38696132 100644
--- a/shared/util.go
+++ b/shared/util.go
@@ -793,9 +793,17 @@ func (e RunError) Error() string {
return e.msg
}
-func RunCommandSplit(name string, arg ...string) (string, string, error) {
+// RunCommandSplit runs a command with a supplied environment and optional arguments and returns the
+// resulting stdout and stderr output as separate variables. If the supplied environment is nil then
+// the default environment is used. If the command fails to start or returns a non-zero exit code
+// then an error is returned containing the output of stderr too.
+func RunCommandSplit(env []string, name string, arg ...string) (string, string, error) {
cmd := exec.Command(name, arg...)
+ if env != nil {
+ cmd.Env = env
+ }
+
var stdout bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &stdout
@@ -815,8 +823,18 @@ func RunCommandSplit(name string, arg ...string) (string, string, error) {
return string(stdout.Bytes()), string(stderr.Bytes()), nil
}
+// RunCommand runs a command with optional arguments and returns stdout. If the command fails to
+// start or returns a non-zero exit code then an error is returned containing the output of stderr.
func RunCommand(name string, arg ...string) (string, error) {
- stdout, _, err := RunCommandSplit(name, arg...)
+ stdout, _, err := RunCommandSplit(nil, name, arg...)
+ return stdout, err
+}
+
+// RunCommandCLocale runs a command with a LANG=C.UTF-8 environment set with optional arguments and
+// returns stdout. If the command fails to start or returns a non-zero exit code then an error is
+// returned containing the output of stderr.
+func RunCommandCLocale(name string, arg ...string) (string, error) {
+ stdout, _, err := RunCommandSplit(append(os.Environ(), "LANG=C.UTF-8"), name, arg...)
return stdout, err
}
More information about the lxc-devel
mailing list