Issue #13639: Accept unicode filenames in tarfile.open(mode="w|gz").
Passing a unicode filename to tarfile.open() along with mode "w|gz" failed
with a UnicodeError because the filename was not encoded properly before being
written to the gzipped stream in the FNAME extra field.
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index ed5bcf2..bd73965 100644
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -454,6 +454,8 @@
0)
timestamp = struct.pack("<L", long(time.time()))
self.__write("\037\213\010\010%s\002\377" % timestamp)
+ if type(self.name) is unicode:
+ self.name = self.name.encode("iso-8859-1", "replace")
if self.name.endswith(".gz"):
self.name = self.name[:-3]
self.__write(self.name + NUL)
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
index 49d2d07..d5b864e 100644
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -994,6 +994,13 @@
finally:
os.umask(original_umask)
+ def test_issue13639(self):
+ try:
+ with tarfile.open(unicode(tmpname, sys.getfilesystemencoding()), self.mode):
+ pass
+ except UnicodeDecodeError:
+ self.fail("_Stream failed to write unicode filename")
+
class GNUWriteTest(unittest.TestCase):
# This testcase checks for correct creation of GNU Longname