summaryrefslogtreecommitdiffstats
path: root/Lib/tarfile.py
diff options
context:
space:
mode:
authorNeal Norwitz <nnorwitz@gmail.com>2005-10-20 04:56:09 (GMT)
committerNeal Norwitz <nnorwitz@gmail.com>2005-10-20 04:56:09 (GMT)
commit1bd3b13fb88ffa2e1e22bbef924563914fc66859 (patch)
tree49fb4baafd4729e302d168f9735c019b7960c5ea /Lib/tarfile.py
parent583e1235c3058dc6d7c20377e8474eba054944fe (diff)
downloadcpython-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.py3
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