mirror of
https://github.com/python/cpython.git
synced 2025-10-09 08:31:26 +00:00
#11116: roll back on error during add so mailbox isn't left corrupted.
This commit is contained in:
parent
8b24aac936
commit
fc14114ca9
3 changed files with 52 additions and 7 deletions
|
@ -277,8 +277,11 @@ class Maildir(Mailbox):
|
|||
tmp_file = self._create_tmp()
|
||||
try:
|
||||
self._dump_message(message, tmp_file)
|
||||
finally:
|
||||
_sync_close(tmp_file)
|
||||
except BaseException:
|
||||
tmp_file.close()
|
||||
os.remove(tmp_file.name)
|
||||
raise
|
||||
_sync_close(tmp_file)
|
||||
if isinstance(message, MaildirMessage):
|
||||
subdir = message.get_subdir()
|
||||
suffix = self.colon + message.get_info()
|
||||
|
@ -724,9 +727,14 @@ class _singlefileMailbox(Mailbox):
|
|||
def _append_message(self, message):
|
||||
"""Append message to mailbox and return (start, stop) offsets."""
|
||||
self._file.seek(0, 2)
|
||||
self._pre_message_hook(self._file)
|
||||
offsets = self._install_message(message)
|
||||
self._post_message_hook(self._file)
|
||||
before = self._file.tell()
|
||||
try:
|
||||
self._pre_message_hook(self._file)
|
||||
offsets = self._install_message(message)
|
||||
self._post_message_hook(self._file)
|
||||
except BaseException:
|
||||
self._file.truncate(before)
|
||||
raise
|
||||
self._file.flush()
|
||||
self._file_length = self._file.tell() # Record current length of mailbox
|
||||
return offsets
|
||||
|
@ -906,7 +914,11 @@ class MH(Mailbox):
|
|||
if self._locked:
|
||||
_lock_file(f)
|
||||
try:
|
||||
self._dump_message(message, f)
|
||||
try:
|
||||
self._dump_message(message, f)
|
||||
except BaseException:
|
||||
os.remove(new_path)
|
||||
raise
|
||||
if isinstance(message, MHMessage):
|
||||
self._dump_sequences(message, new_key)
|
||||
finally:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue