summaryrefslogtreecommitdiffstats
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
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.
-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(