diff options
author | Lars Wirzenius <liw@liw.fi> | 2012-11-24 20:23:49 +0000 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2012-11-24 20:23:49 +0000 |
commit | b3f4eea63f1b45f290df64ff01438fab7fe4e597 (patch) | |
tree | b4192658a4b0b61187c30cab8ba1eaac65efa81c | |
parent | b6feca76369c48e78d64bc7e1660cc32d16c479f (diff) | |
download | obnam-b3f4eea63f1b45f290df64ff01438fab7fe4e597.tar.gz |
Restore setuid/setgid bits correctly as root
Reported by Pavel Kokolemin.
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | obnamlib/metadata.py | 9 |
2 files changed, 7 insertions, 4 deletions
@@ -46,6 +46,8 @@ Bug fixes: Error messages should now be somewhat clearer. * Unset or wrongly set variable "full" fixed in "obnam diff". Reported by ROGERIO DE CARVALHO BASTOS and patched by Peter Valdemar Mørch. +* Setuid and setgid bits are now restored correctly, when restore happens + as root. Reported by Pavel Kokolemin. Version 1.2, released 2012-10-06 -------------------------------- diff --git a/obnamlib/metadata.py b/obnamlib/metadata.py index eaca40fb..2c6bb1fe 100644 --- a/obnamlib/metadata.py +++ b/obnamlib/metadata.py @@ -232,6 +232,11 @@ def set_metadata(fs, filename, metadata, getuid=None): ''' + # Set owner before mode, so that a setuid bit does not get reset. + getuid = getuid or os.getuid + if getuid() == 0: + fs.lchown(filename, metadata.st_uid, metadata.st_gid) + if stat.S_ISLNK(metadata.st_mode): fs.symlink(metadata.target, filename) else: @@ -242,10 +247,6 @@ def set_metadata(fs, filename, metadata, getuid=None): fs.lutimes(filename, metadata.st_atime_sec, metadata.st_atime_nsec, metadata.st_mtime_sec, metadata.st_mtime_nsec) - - getuid = getuid or os.getuid - if getuid() == 0: - fs.lchown(filename, metadata.st_uid, metadata.st_gid) metadata_format = struct.Struct('!Q' + # flags |