Index: Lib/tarfile.py =================================================================== --- Lib/tarfile.py (révision 76341) +++ Lib/tarfile.py (copie de travail) @@ -1540,36 +1540,42 @@ if errorlevel is not None: self.errorlevel = errorlevel - # Init datastructures. - self.closed = False - self.members = [] # list of members as TarInfo objects - self._loaded = False # flag if all members have been read - self.offset = self.fileobj.tell() - # current position in the archive file - self.inodes = {} # dictionary caching the inodes of - # archive members already added + try: + # Init datastructures. + self.closed = False + self.members = [] # list of members as TarInfo objects + self._loaded = False # flag if all members have been read + self.offset = self.fileobj.tell() + # current position in the archive file + self.inodes = {} # dictionary caching the inodes of + # archive members already added - if self.mode == "r": - self.firstmember = None - self.firstmember = self.next() + if self.mode == "r": + self.firstmember = None + self.firstmember = self.next() - if self.mode == "a": - # Move to the end of the archive, - # before the first empty block. - self.firstmember = None - while True: - if self.next() is None: - if self.offset > 0: - self.fileobj.seek(self.fileobj.tell() - BLOCKSIZE) - break + if self.mode == "a": + # Move to the end of the archive, + # before the first empty block. + self.firstmember = None + while True: + if self.next() is None: + if self.offset > 0: + self.fileobj.seek(self.fileobj.tell() - BLOCKSIZE) + break - if self.mode in "aw": - self._loaded = True + if self.mode in "aw": + self._loaded = True - if self.pax_headers: - buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) - self.fileobj.write(buf) - self.offset += len(buf) + if self.pax_headers: + buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) + self.fileobj.write(buf) + self.offset += len(buf) + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise #-------------------------------------------------------------------------- # Below are the classmethods which act as alternate constructors to the