Java python tarfile.py“;无法成功打开文件";

Java python tarfile.py“;无法成功打开文件";,java,python,python-2.7,maven-assembly-plugin,Java,Python,Python 2.7,Maven Assembly Plugin,我有一个tarball无法使用python打开: >>> import tarfile >>> tarfile.open('/tmp/bad.tar.gz') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "tarfile.py", line 1672, in open raise ReadError("file c

我有一个tarball无法使用python打开:

>>> import tarfile
>>> tarfile.open('/tmp/bad.tar.gz')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "tarfile.py", line 1672, in open
    raise ReadError("file could not be opened successfully")
tarfile.ReadError: file could not be opened successfully
我已经跟踪了python
tarfile
code,有一个函数“
nti
”,它们在其中转换字节。到了这一行:

obj.uid = nti(buf[108:116])

爆炸了。这些位(用于UID)以八个空格的形式通过。不确定从这里走到哪里…

老实说,这个bug似乎在
tarfile.py
nti
函数中:

n = int(nts(s) or "0", 8)
直通逻辑(
或“0”
)不起作用,因为
s
是空格,而不是
None
,所以
int()
爆炸

我从
/var/lib/python2.7/
复制了
tarfile.py
,并用try/catch包装了这一行,解决了我的问题:

    try:
        obj.uid = nti(buf[108:116])
    except InvalidHeaderError:
        obj.uid = 0
不过,这是一个黑客解决方案。实际上,我更希望python的人看看它并修复“
或“0”
逻辑

更新


原来tarball是由刚刚升级到Java 7的Java 6项目中的
maven assembly插件创建的。通过将
maven assembly插件升级到
2.5.3

解决了这个问题,所以tar文件已损坏?偏移量为108到116的非数字将取消它作为tar文件的资格。@E如果我们将“腐败”的定义更改为“是否打开文件?”?“那么不,它没有损坏。:-)@EugeneK我完全同意你的观点,从python可能遵循规范的角度来看,这个文件的行为不正确。另一方面如果您没有设置UID和GID位?这是否意味着python会致命地崩溃?似乎反应过度。我不确定除了抛出异常之外还有什么其他选择。你只能猜这么多。GNU Tar Util的工作方式确实不同,而且更安全。例如,Tar规范说它必须是512对齐的(我想,或者它必须在512 0中结束),如果不是这样,很多事情都会失败,但GNU Tar Util仍然有效。@Inahutshellus我认为如果你没有设置UID和GID位,那么它必须为每一个设置任意8位,否则,报头未对齐,Deachiver必须猜测数据的起始位置,即仍然是512英寸或更早?可能是zlib上的编译错误。
    try:
        obj.uid = nti(buf[108:116])
    except InvalidHeaderError:
        obj.uid = 0