diff -u a/tarfile.py b/tarfile.py --- a/tarfile.py 2010-11-02 01:55:03.765219300 -0400 +++ b/tarfile.py 2010-11-02 01:57:34.039814500 -0400 @@ -2118,8 +2118,14 @@ raise StreamError("cannot extract (sym)link as file object") else: # A (sym)link's file object is its target's file object. - return self.extractfile(self._getmember(tarinfo.linkname, - tarinfo)) + # The target is usually relative to the actual link. + parent = os.path.dirname(tarinfo.name) + target = normpath(upperdir + "/" + tarinfo.linkname) + member = self._getmember(target, tarinfo) + if member is None: + # Fallback to absolute. + member = self._getmember(tarinfo.linkname, tarinfo) + return self.extractfile(member) else: # If there's no data associated with the member (directory, chrdev, # blkdev, etc.), return None instead of a file object. Only in b: tarfile.py~