restore: suppress lchown errors when not running as root

Like "cp -a" and "rsync -a" do, only report lchown errors if we run
as root.

Like cp from GNU coreutils does, we check Geteuid() to determine if
we are running as root
( http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/copy.c#n3012 ).

On Windows, lchown errors are always reported.

Fixes https://github.com/restic/restic/issues/1766
This commit is contained in:
Jakob Unterwurzacher
2018-09-09 11:43:18 +02:00
parent bd9022962e
commit e42d2d1da8
2 changed files with 17 additions and 1 deletions

View File

@@ -186,7 +186,16 @@ func (node Node) restoreMetadata(path string) error {
var firsterr error
if err := lchown(path, int(node.UID), int(node.GID)); err != nil {
firsterr = errors.Wrap(err, "Lchown")
// Like "cp -a" and "rsync -a" do, we only report lchown permission errors
// if we run as root.
// On Windows, Geteuid always returns -1, and we always report lchown
// permission errors.
if os.Geteuid() > 0 && os.IsPermission(err) {
debug.Log("not running as root, ignoring lchown permission error for %v: %v",
path, err)
} else {
firsterr = errors.Wrap(err, "Lchown")
}
}
if node.Type != "symlink" {