aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Lib/tarfile.py
diff options
context:
space:
mode:
authorshadchin <shadchin@yandex-team.com>2024-02-12 07:53:52 +0300
committerDaniil Cherednik <dcherednik@ydb.tech>2024-02-14 14:26:16 +0000
commit31f2a419764a8ba77c2a970cfc80056c6cd06756 (patch)
treec1995d239eba8571cefc640f6648e1d5dd4ce9e2 /contrib/tools/python3/src/Lib/tarfile.py
parentfe2ef02b38d9c85d80060963b265a1df9f38c3bb (diff)
downloadydb-31f2a419764a8ba77c2a970cfc80056c6cd06756.tar.gz
Update Python from 3.11.8 to 3.12.2
Diffstat (limited to 'contrib/tools/python3/src/Lib/tarfile.py')
-rwxr-xr-xcontrib/tools/python3/src/Lib/tarfile.py60
1 files changed, 31 insertions, 29 deletions
diff --git a/contrib/tools/python3/src/Lib/tarfile.py b/contrib/tools/python3/src/Lib/tarfile.py
index 612217b1ad..3bbbcaa621 100755
--- a/contrib/tools/python3/src/Lib/tarfile.py
+++ b/contrib/tools/python3/src/Lib/tarfile.py
@@ -58,19 +58,18 @@ except ImportError:
grp = None
# os.symlink on Windows prior to 6.0 raises NotImplementedError
-symlink_exception = (AttributeError, NotImplementedError)
-try:
- # OSError (winerror=1314) will be raised if the caller does not hold the
- # SeCreateSymbolicLinkPrivilege privilege
- symlink_exception += (OSError,)
-except NameError:
- pass
+# OSError (winerror=1314) will be raised if the caller does not hold the
+# SeCreateSymbolicLinkPrivilege privilege
+symlink_exception = (AttributeError, NotImplementedError, OSError)
# from tarfile import *
__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError", "ReadError",
"CompressionError", "StreamError", "ExtractError", "HeaderError",
"ENCODING", "USTAR_FORMAT", "GNU_FORMAT", "PAX_FORMAT",
- "DEFAULT_FORMAT", "open"]
+ "DEFAULT_FORMAT", "open","fully_trusted_filter", "data_filter",
+ "tar_filter", "FilterError", "AbsoluteLinkError",
+ "OutsideDestinationError", "SpecialFileError", "AbsolutePathError",
+ "LinkOutsideDestinationError"]
#---------------------------------------------------------
@@ -341,7 +340,8 @@ class _Stream:
_Stream is intended to be used only internally.
"""
- def __init__(self, name, mode, comptype, fileobj, bufsize):
+ def __init__(self, name, mode, comptype, fileobj, bufsize,
+ compresslevel):
"""Construct a _Stream object.
"""
self._extfileobj = True
@@ -376,7 +376,7 @@ class _Stream:
self.exception = zlib.error
self._init_read_gz()
else:
- self._init_write_gz()
+ self._init_write_gz(compresslevel)
elif comptype == "bz2":
try:
@@ -388,7 +388,7 @@ class _Stream:
self.cmp = bz2.BZ2Decompressor()
self.exception = OSError
else:
- self.cmp = bz2.BZ2Compressor()
+ self.cmp = bz2.BZ2Compressor(compresslevel)
elif comptype == "xz":
try:
@@ -415,13 +415,14 @@ class _Stream:
if hasattr(self, "closed") and not self.closed:
self.close()
- def _init_write_gz(self):
+ def _init_write_gz(self, compresslevel):
"""Initialize for writing with gzip compression.
"""
- self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED,
- -self.zlib.MAX_WBITS,
- self.zlib.DEF_MEM_LEVEL,
- 0)
+ self.cmp = self.zlib.compressobj(compresslevel,
+ self.zlib.DEFLATED,
+ -self.zlib.MAX_WBITS,
+ self.zlib.DEF_MEM_LEVEL,
+ 0)
timestamp = struct.pack("<L", int(time.time()))
self.__write(b"\037\213\010\010" + timestamp + b"\002\377")
if self.name.endswith(".gz"):
@@ -608,12 +609,12 @@ class _FileInFile(object):
object.
"""
- def __init__(self, fileobj, offset, size, blockinfo=None):
+ def __init__(self, fileobj, offset, size, name, blockinfo=None):
self.fileobj = fileobj
self.offset = offset
self.size = size
self.position = 0
- self.name = getattr(fileobj, "name", None)
+ self.name = name
self.closed = False
if blockinfo is None:
@@ -710,7 +711,7 @@ class ExFileObject(io.BufferedReader):
def __init__(self, tarfile, tarinfo):
fileobj = _FileInFile(tarfile.fileobj, tarinfo.offset_data,
- tarinfo.size, tarinfo.sparse)
+ tarinfo.size, tarinfo.name, tarinfo.sparse)
super().__init__(fileobj)
#class ExFileObject
@@ -1435,11 +1436,7 @@ class TarInfo(object):
# the newline. keyword and value are both UTF-8 encoded strings.
regex = re.compile(br"(\d+) ([^=]+)=")
pos = 0
- while True:
- match = regex.match(buf, pos)
- if not match:
- break
-
+ while match := regex.match(buf, pos):
length, keyword = match.groups()
length = int(length)
if length == 0:
@@ -1832,7 +1829,9 @@ class TarFile(object):
if filemode not in ("r", "w"):
raise ValueError("mode must be 'r' or 'w'")
- stream = _Stream(name, filemode, comptype, fileobj, bufsize)
+ compresslevel = kwargs.pop("compresslevel", 9)
+ stream = _Stream(name, filemode, comptype, fileobj, bufsize,
+ compresslevel)
try:
t = cls(name, filemode, stream, **kwargs)
except:
@@ -2219,6 +2218,11 @@ class TarFile(object):
if filter is None:
filter = self.extraction_filter
if filter is None:
+ warnings.warn(
+ 'Python 3.14 will, by default, filter extracted tar '
+ + 'archives and reject files or modify their metadata. '
+ + 'Use the filter argument to control this behavior.',
+ DeprecationWarning)
return fully_trusted_filter
if isinstance(filter, str):
raise TypeError(
@@ -2689,10 +2693,8 @@ class TarFile(object):
"""Read through the entire archive file and look for readable
members.
"""
- while True:
- tarinfo = self.next()
- if tarinfo is None:
- break
+ while self.next() is not None:
+ pass
self._loaded = True
def _check(self, mode=None):