when changing volume, then also close external file object in _Stream
authorChristian Herdtweck <christian.herdtweck@intra2net.com>
Thu, 21 Jul 2016 15:39:41 +0000 (17:39 +0200)
committerChristian Herdtweck <christian.herdtweck@intra2net.com>
Fri, 12 Nov 2021 12:32:59 +0000 (13:32 +0100)
deltatar/tarfile.py

index fcb6dcc..bddfbb7 100644 (file)
@@ -2742,6 +2742,10 @@ class TarFile(object):
 
                 # close current volume file (even if fileobj is external)
                 self.fileobj.close()
+                if isinstance(self.fileobj, _Stream):
+                    # _Stream.close() never closes external fileobj
+                    self._dbg(3, 'closing _Stream\'s external fileobj')
+                    self.fileobj.fileobj.close()
 
                 try:
                     if not self.new_volume_handler or\
@@ -3086,6 +3090,11 @@ class TarFile(object):
                     copyfileobj(source, target, tarinfo.size)
                 except OSError:
                     source.close()
+                    if isinstance(source, _Stream) and source._extfileobj:
+                        # _Stream.close() never closes external fileobj
+                        self._dbg(3, 'closing _Stream\'s external fileobj')
+                        source.fileobj.close()
+
                     # only if we are extracting a multivolume this can be treated
                     if not self.new_volume_handler:
                         raise Exception("We need to read a new volume and you"