You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
gettarinfo method does not handle files without text string names #66195
bpo-22468: Tarfile using fstat on GZip file object
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=<Date2016-02-20.00:27:16.450>created_at=<Date2014-07-17.07:52:08.286>labels= ['library', 'docs']
title='gettarinfo method does not handle files without text string names'updated_at=<Date2016-02-20.00:27:16.448>user='https://github.com/vadmium'
It looks like if you pass a “fileobj” argument to “gettarinfo”, it assumes it can use the “name” as a text string.
>>> import tarfile
>>> with tarfile.open("/dev/null", "w") as tar, open("/bin/sh", "rb") asfile: tar.gettarinfo(fileobj=file)
...
<TarInfo 'bin/sh' at 0x7f13cc937f20>
>>> with tarfile.open("/dev/null", "w") as tar, open(b"/bin/sh", "rb") asfile: tar.gettarinfo(fileobj=file)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/media/disk/home/proj/python/cpython/Lib/tarfile.py", line 1767, in gettarinfo
arcname = arcname.replace(os.sep, "/")
TypeError: expected bytes, bytearray or buffer compatible object
>>> with tarfile.open("/dev/null", "w") as tar, open(0, "rb", closefd=False) asfile: tar.gettarinfo(fileobj=file)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/media/disk/home/proj/python/cpython/Lib/tarfile.py", line 1766, in gettarinfo
drv, arcname = os.path.splitdrive(arcname)
File "Lib/posixpath.py", line 133, in splitdrive
return p[:0], p
TypeError: 'int' object is not subscriptable
In my case, my code always sets the final TarInfo.name attribute later on, so the initial name does not matter. Perhaps at least the documentation should say that “fileobj.name” must be a real unencoded file name string unless “arcname” is also given. My workaround was to add a dummy arcname argument, a bit like this:
# Explicit dummy name to avoid using file name of bytestarinfo=self.tar.gettarinfo(fileobj=file, arcname="")
# . . .tarinfo.name="{}/{}".format(self.pkgname, name)
Activity
vadmium commentedon Jul 17, 2014
It looks like if you pass a “fileobj” argument to “gettarinfo”, it assumes it can use the “name” as a text string.
In my case, my code always sets the final TarInfo.name attribute later on, so the initial name does not matter. Perhaps at least the documentation should say that “fileobj.name” must be a real unencoded file name string unless “arcname” is also given. My workaround was to add a dummy arcname argument, a bit like this:
bitdancer commentedon Jul 19, 2014
Agreed, the documentation should be modified to say "(using os.fstat on its file descriptor, and its 'name' attribute if arcname is not specified").
vadmium commentedon Apr 20, 2015
Over in bpo-22468, I posted a documentation patch which includes wording to address this bug.
python-dev commentedon Feb 20, 2016
New changeset 94a94deaf06a by Martin Panter in branch '3.5':
Issues bpo-22468, bpo-21996, bpo-22208: Clarify gettarinfo() and TarInfo usage
https://hg.python.org/cpython/rev/94a94deaf06a
New changeset 9d5217aaea13 by Martin Panter in branch '2.7':
Issues bpo-22468, bpo-21996, bpo-22208: Clarify gettarinfo() and TarInfo usage
https://hg.python.org/cpython/rev/9d5217aaea13