diff options
author | Xavier de Gaye <xdegaye@users.sourceforge.net> | 2016-12-09 08:35:49 (GMT) |
---|---|---|
committer | Xavier de Gaye <xdegaye@users.sourceforge.net> | 2016-12-09 08:35:49 (GMT) |
commit | ec80ba469393397eb8ff2f140e3fc76c944494be (patch) | |
tree | 0a83a10a0a47d258edce1e97cfbfabb0e01e9f38 /Lib | |
parent | 887b4307b62f2b3d6f757abe648df6808c045eae (diff) | |
parent | f44abdab1eeb75e2a876e905e3af20b461ab0f6c (diff) | |
download | cpython-ec80ba469393397eb8ff2f140e3fc76c944494be.zip cpython-ec80ba469393397eb8ff2f140e3fc76c944494be.tar.gz cpython-ec80ba469393397eb8ff2f140e3fc76c944494be.tar.bz2 |
Issue #26937: Merge 3.6.
Diffstat (limited to 'Lib')
-rwxr-xr-x | Lib/tarfile.py | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/Lib/tarfile.py b/Lib/tarfile.py index b78b1b1..5d4c86c 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -50,9 +50,13 @@ import copy import re try: - import grp, pwd + import pwd except ImportError: - grp = pwd = None + pwd = None +try: + import grp +except ImportError: + grp = None # os.symlink on Windows prior to 6.0 raises NotImplementedError symlink_exception = (AttributeError, NotImplementedError) @@ -2219,22 +2223,25 @@ class TarFile(object): def chown(self, tarinfo, targetpath, numeric_owner): """Set owner of targetpath according to tarinfo. If numeric_owner - is True, use .gid/.uid instead of .gname/.uname. + is True, use .gid/.uid instead of .gname/.uname. If numeric_owner + is False, fall back to .gid/.uid when the search based on name + fails. """ - if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: + if hasattr(os, "geteuid") and os.geteuid() == 0: # We have to be root to do so. - if numeric_owner: - g = tarinfo.gid - u = tarinfo.uid - else: + g = tarinfo.gid + u = tarinfo.uid + if not numeric_owner: try: - g = grp.getgrnam(tarinfo.gname)[2] + if grp: + g = grp.getgrnam(tarinfo.gname)[2] except KeyError: - g = tarinfo.gid + pass try: - u = pwd.getpwnam(tarinfo.uname)[2] + if pwd: + u = pwd.getpwnam(tarinfo.uname)[2] except KeyError: - u = tarinfo.uid + pass try: if tarinfo.issym() and hasattr(os, "lchown"): os.lchown(targetpath, u, g) |