Skip to content

Commit

Permalink
If chcon fails, check if label is already correct
Browse files Browse the repository at this point in the history
Currently if a user attempts to chcon a file or directory and fails for
any reason check if the file already has the right label, and continue.

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
  • Loading branch information
rhatdan committed Sep 26, 2022
1 parent 00d547f commit 5614eca
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 1 deletion.
13 changes: 13 additions & 0 deletions go-selinux/rchcon.go
Expand Up @@ -12,7 +12,20 @@ import (
)

func rchcon(fpath, label string) error {
slowMode := false
// If the current label matches the new label, assume
// other labels are correct.
if currentLabel, err := lFileLabel(fpath); err == nil &&
label == currentLabel {
slowMode = true
}
return pwalkdir.Walk(fpath, func(p string, _ fs.DirEntry, _ error) error {
if slowMode {
if currentLabel, err := lFileLabel(p); err == nil &&
label == currentLabel {
return nil
}
}
e := lSetFileLabel(p, label)
// Walk a file tree can race with removal, so ignore ENOENT.
if errors.Is(e, os.ErrNotExist) {
Expand Down
13 changes: 12 additions & 1 deletion go-selinux/selinux_linux.go
Expand Up @@ -1084,7 +1084,18 @@ func chcon(fpath string, label string, recurse bool) error {
}

if !recurse {
return setFileLabel(fpath, label)
err := lSetFileLabel(fpath, label)
if err == nil {
return nil
}
if errors.Is(err, os.ErrNotExist) {
return err
}
flabel, _ := lFileLabel(fpath)
if flabel == label {
return nil
}
return err
}

return rchcon(fpath, label)
Expand Down

0 comments on commit 5614eca

Please sign in to comment.