diff options
author | Gary Oberbrunner <garyo@oberbrunner.com> | 2009-05-12 02:01:33 (GMT) |
---|---|---|
committer | Gary Oberbrunner <garyo@oberbrunner.com> | 2009-05-12 02:01:33 (GMT) |
commit | 866e405b3f17ade520ab8a13e5a09c342cb26015 (patch) | |
tree | c0b7f3a4399de322b6fa914396370a31bf80de5b /src | |
parent | b44d0f7897c5582b72641b79862cc901faa655c1 (diff) | |
download | SCons-866e405b3f17ade520ab8a13e5a09c342cb26015.zip SCons-866e405b3f17ade520ab8a13e5a09c342cb26015.tar.gz SCons-866e405b3f17ade520ab8a13e5a09c342cb26015.tar.bz2 |
Fix issue 1382: chown .sconsign.dblite back to original user/group when done, when running as root. If it didn't exist, chown to user who executed sudo if known. Hard to test automatically because test needs to run as root.
Diffstat (limited to 'src')
-rw-r--r-- | src/engine/SCons/dblite.py | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/engine/SCons/dblite.py b/src/engine/SCons/dblite.py index 6d4cfd5..e993219 100644 --- a/src/engine/SCons/dblite.py +++ b/src/engine/SCons/dblite.py @@ -45,6 +45,7 @@ class dblite: _open = __builtin__.open _cPickle_dump = cPickle.dump _os_chmod = os.chmod + _os_chown = os.chown _os_rename = os.rename _os_unlink = os.unlink _shutil_copyfile = shutil.copyfile @@ -65,6 +66,20 @@ class dblite: self._mode = mode self._dict = {} self._needs_sync = 00000 + if os.geteuid()==0 or os.getuid()==0: + # running as root; chown back to current owner/group when done + try: + statinfo = os.stat(self._file_name) + self._chown_to = statinfo.st_uid + self._chgrp_to = statinfo.st_gid + except OSError, e: + # db file doesn't exist yet. + # Check os.environ for SUDO_UID, use if set + self._chown_to = int(os.environ.get('SUDO_UID', -1)) + self._chgrp_to = int(os.environ.get('SUDO_GID', -1)) + else: + self._chown_to = -1 # don't chown + self._chgrp_to = -1 # don't chgrp if (self._flag == "n"): self._open(self._file_name, "wb", self._mode) else: @@ -103,6 +118,11 @@ class dblite: except OSError: pass self._os_unlink(self._file_name) self._os_rename(self._tmp_name, self._file_name) + if self._chown_to > 0: # don't chown to root or -1 + try: + self._os_chown(self._file_name, self._chown_to, self._chgrp_to) + except OSError: + pass self._needs_sync = 00000 if (keep_all_files): self._shutil_copyfile( |