From 4518bce5bb440fc6bed37e658c2aad7855633ced Mon Sep 17 00:00:00 2001 From: Dan Walsh Date: Mon, 6 Apr 2015 10:07:08 -0400 Subject: [PATCH] Add value checking on relabel command for selinux Docker-DCO-1.1-Signed-off-by: Dan Walsh (github: rhatdan) --- label/label_selinux.go | 8 +++++++- label/label_selinux_test.go | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/label/label_selinux.go b/label/label_selinux.go index 5983031ae..efe4b4696 100644 --- a/label/label_selinux.go +++ b/label/label_selinux.go @@ -104,7 +104,13 @@ func Relabel(path string, fileLabel string, relabel string) error { if fileLabel == "" { return nil } - if relabel == "z" { + if !strings.ContainsAny(relabel, "zZ") { + return nil + } + if strings.Contains(relabel, "z") && strings.Contains(relabel, "Z") { + return fmt.Errorf("Bad SELinux option z and Z can not be used together") + } + if strings.Contains(relabel, "z") { c := selinux.NewContext(fileLabel) c["level"] = "s0" fileLabel = c.Get() diff --git a/label/label_selinux_test.go b/label/label_selinux_test.go index 8629353f2..acbd59da6 100644 --- a/label/label_selinux_test.go +++ b/label/label_selinux_test.go @@ -87,3 +87,22 @@ func TestDuplicateLabel(t *testing.T) { t.Errorf("DisableSecOpt Failed level incorrect") } } +func TestRelabel(t *testing.T) { + testdir := "/tmp/test" + label := "system_u:system_r:svirt_sandbox_file_t:s0:c1,c2" + if err := Relabel(testdir, "", "z"); err != nil { + t.Fatal("Relabel with no label failed: %v", err) + } + if err := Relabel(testdir, label, ""); err != nil { + t.Fatal("Relabel with no relabel field failed: %v", err) + } + if err := Relabel(testdir, label, "z"); err != nil { + t.Fatal("Relabel shared failed: %v", err) + } + if err := Relabel(testdir, label, "Z"); err != nil { + t.Fatal("Relabel unshared failed: %v", err) + } + if err := Relabel(testdir, label, "zZ"); err == nil { + t.Fatal("Relabel with shared and unshared succeeded: %v", err) + } +}