diff options
author | Neal Norwitz <nnorwitz@gmail.com> | 2005-10-20 04:56:09 (GMT) |
---|---|---|
committer | Neal Norwitz <nnorwitz@gmail.com> | 2005-10-20 04:56:09 (GMT) |
commit | 1bd3b13fb88ffa2e1e22bbef924563914fc66859 (patch) | |
tree | 49fb4baafd4729e302d168f9735c019b7960c5ea /Lib/tarfile.py | |
parent | 583e1235c3058dc6d7c20377e8474eba054944fe (diff) | |
download | cpython-1bd3b13fb88ffa2e1e22bbef924563914fc66859.zip cpython-1bd3b13fb88ffa2e1e22bbef924563914fc66859.tar.gz cpython-1bd3b13fb88ffa2e1e22bbef924563914fc66859.tar.bz2 |
Backport:
Fix SF bug # 1330039, patch # 1331635 from Lars Gustaebel (tarfile maintainer)
Problem: if two files are assigned the same inode
number by the filesystem, the second one will be added
as a hardlink to the first, which means that the
content will be lost.
The patched code checks if the file's st_nlink is
greater 1. So only for files that actually have several
links pointing to them hardlinks will be created, which
is what GNU tar does.
Diffstat (limited to 'Lib/tarfile.py')
-rw-r--r-- | Lib/tarfile.py | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/Lib/tarfile.py b/Lib/tarfile.py index ce4d02f..ed7b509 100644 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -1103,7 +1103,8 @@ class TarFile(object): stmd = statres.st_mode if stat.S_ISREG(stmd): inode = (statres.st_ino, statres.st_dev) - if inode in self.inodes and not self.dereference: + if not self.dereference and \ + statres.st_nlink > 1 and inode in self.inodes: # Is it a hardlink to an already # archived file? type = LNKTYPE |