New submission from Andriy Maletsky <andriy.malet...@gmail.com>:

Consider a simple write to a zip file:


import zipfile

with zipfile.ZipFile('/workdir/archive.zip', 'w', 
compression=zipfile.ZIP_DEFLATED) as zip_archive:
    zip_archive.write('/workdir/data.csv', arcname='data.csv')
    print('exiting from context manager...')


If a signal handler is fired and raises an exception during certain points of 
write() execution, such an error occurs (py 3.7.2):


Traceback (most recent call last):
  File "zipissue.py", line 4, in <module>
    zip_archive.write('/workdir/data.csv', arcname='data.csv')
  File "/usr/local/lib/python3.7/zipfile.py", line 1744, in write
    shutil.copyfileobj(src, dest, 1024*8)
  File "/usr/local/lib/python3.7/zipfile.py", line 1107, in close
    buf = self._compressor.flush()
KeyboardInterrupt

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "zipissue.py", line 5, in <module>
    print('exiting from context manager...')
  File "/usr/local/lib/python3.7/zipfile.py", line 1265, in __exit__
    self.close()
  File "/usr/local/lib/python3.7/zipfile.py", line 1798, in close
    raise ValueError("Can't close the ZIP file while there is "
ValueError: Can't close the ZIP file while there is an open writing handle on 
it. Close the writing handle before closing the zip.
Exception ignored in: <function ZipFile.__del__ at 0x7fbeea4fcd08>
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/zipfile.py", line 1789, in __del__
  File "/usr/local/lib/python3.7/zipfile.py", line 1798, in close
ValueError: Can't close the ZIP file while there is an open writing handle on 
it. Close the writing handle before closing the zip.


Before any write the `ZipFile._writing` flag is set, and that flag is cleared 
at `_ZipWriteFile.close()`. But if signalled inside `_ZipWriteFile.close()` we 
are moving to a broken state: we don't write anything anymore, but 
`ZipFile._writing` is still set. Therefore we cannot clearly close ZipFile. As 
ZipFile contextmanager swallows KeyboardInterrupt and produces an exception of 
`Exception` type, this leads to the impossibility of proper program shutdown.

I believe that by simply moving `ZipFile._writing = False` in 
`_ZipWriteFile.close()` to some finally block, this issue will be solved safely.

----------
components: Library (Lib)
messages: 338863
nosy: and800
priority: normal
severity: normal
status: open
title: Zipfile breaks if signalled during write()
type: behavior
versions: Python 3.5, Python 3.6, Python 3.7, Python 3.8, Python 3.9

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue36434>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to