#11116: roll back on error during add so mailbox isn't left corrupted.

This commit is contained in:
R. David Murray 2011-02-11 22:47:17 +00:00
parent 8b24aac936
commit fc14114ca9
3 changed files with 52 additions and 7 deletions

View file

@ -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: