summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2012-11-24 20:23:49 +0000
committerLars Wirzenius <liw@liw.fi>2012-11-24 20:23:49 +0000
commitb3f4eea63f1b45f290df64ff01438fab7fe4e597 (patch)
treeb4192658a4b0b61187c30cab8ba1eaac65efa81c
parentb6feca76369c48e78d64bc7e1660cc32d16c479f (diff)
downloadobnam-b3f4eea63f1b45f290df64ff01438fab7fe4e597.tar.gz
Restore setuid/setgid bits correctly as root
Reported by Pavel Kokolemin.
-rw-r--r--NEWS2
-rw-r--r--obnamlib/metadata.py9
2 files changed, 7 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index 5ee07324..81380596 100644
--- a/NEWS
+++ b/NEWS
@@ -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