diff options
Diffstat (limited to 'Lib/tarfile.py')
| -rw-r--r-- | Lib/tarfile.py | 12 | 
1 files changed, 10 insertions, 2 deletions
| diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 4839eb1aef..aca934a9b7 100644 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -2273,7 +2273,7 @@ class TarFile(object):            (platform limitation), we try to make a copy of the referenced file            instead of a link.          """ -        if hasattr(os, "symlink") and hasattr(os, "link"): +        try:              # For systems that support symbolic and hard links.              if tarinfo.issym():                  os.symlink(tarinfo.linkname, targetpath) @@ -2282,7 +2282,15 @@ class TarFile(object):                  if os.path.exists(tarinfo._link_target):                      os.link(tarinfo._link_target, targetpath)                  else: -                    self._extract_member(self._find_link_target(tarinfo), targetpath) +                    self._extract_mem +        except (AttributeError, NotImplementedError, WindowsError): +            # AttributeError if no os.symlink +            # NotImplementedError if on Windows XP +            # WindowsError (1314) if the required privilege is not held by the client +            if tarinfo.issym(): +                linkpath = os.path.join(os.path.dirname(tarinfo.name),tarinfo.linkname) +            else: +                linkpath = tarinfo.linkname          else:              try:                  self._extract_member(self._find_link_target(tarinfo), targetpath) | 
