summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGary Oberbrunner <garyo@oberbrunner.com>2009-05-12 02:01:33 (GMT)
committerGary Oberbrunner <garyo@oberbrunner.com>2009-05-12 02:01:33 (GMT)
commit866e405b3f17ade520ab8a13e5a09c342cb26015 (patch)
treec0b7f3a4399de322b6fa914396370a31bf80de5b /src
parentb44d0f7897c5582b72641b79862cc901faa655c1 (diff)
downloadSCons-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.py20
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(