diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 2c06f9160c658a..f9579e4c846a32 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -349,7 +349,7 @@ def __init__(self, name, mode, comptype, fileobj, bufsize): fileobj = _StreamProxy(fileobj) comptype = fileobj.getcomptype() - self.name = name or "" + self.name = os.fspath(name) if name else "" self.mode = mode self.comptype = comptype self.fileobj = fileobj @@ -1454,6 +1454,7 @@ def __init__(self, name=None, mode="r", fileobj=None, format=None, self.mode = mode self._mode = modes[mode] + name = os.fspath(name) if name else None if not fileobj: if self.mode == "a" and not os.path.exists(name): # Create nonexistent files in append mode. @@ -1468,6 +1469,7 @@ def __init__(self, name=None, mode="r", fileobj=None, format=None, if hasattr(fileobj, "mode"): self._mode = fileobj.mode self._extfileobj = True + self.name = os.path.abspath(name) if name else None self.fileobj = fileobj @@ -1938,6 +1940,7 @@ def add(self, name, arcname=None, recursive=True, *, filter=None): excluded from the archive. """ self._check("awx") + name = os.fspath(name) if arcname is None: arcname = name diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 7e32cbccd6c56d..c4a51be8c86306 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -1368,7 +1368,7 @@ def write(self, data): f = BadFile() with self.assertRaises(exctype): - tar = tarfile.open(tmpname, self.mode, fileobj=f, + tarfile.open(tmpname, self.mode, fileobj=f, format=tarfile.PAX_FORMAT, pax_headers={'non': 'empty'}) self.assertFalse(f.closed) @@ -1421,6 +1421,12 @@ def test_file_mode(self): finally: os.umask(original_umask) + def test_open_by_path_object(self): + # Test for issue #37144: + # broken open for stream write by path-like object + with tarfile.open(pathlib.Path(tmpname), self.mode): + pass + class GzipStreamWriteTest(GzipTest, StreamWriteTest): pass diff --git a/Misc/NEWS.d/next/Library/2019-06-04-16-50-56.bpo-37144.Yu8j2L.rst b/Misc/NEWS.d/next/Library/2019-06-04-16-50-56.bpo-37144.Yu8j2L.rst new file mode 100644 index 00000000000000..c716f92b97297f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-04-16-50-56.bpo-37144.Yu8j2L.rst @@ -0,0 +1 @@ +Now `tarfile.open(path, 'w|gz')` works for path-like objects \ No newline at end of file