]> granicus.if.org Git - python/commitdiff
Merged revisions 88403 via svnmerge from
authorR. David Murray <rdmurray@bitdance.com>
Fri, 11 Feb 2011 23:03:13 +0000 (23:03 +0000)
committerR. David Murray <rdmurray@bitdance.com>
Fri, 11 Feb 2011 23:03:13 +0000 (23:03 +0000)
svn+ssh://pythondev@svn.python.org/python/branches/py3k

Test not backported since they depend on 3.x quirks.  Not
easy to rewrite them for 2.7.

........
  r88403 | r.david.murray | 2011-02-11 17:47:17 -0500 (Fri, 11 Feb 2011) | 3 lines

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

Lib/mailbox.py
Misc/NEWS

index 2b7b14e2f1aab8620a13c2a88d42bfb18e32c13f..5f54ea13128c8f1d9c71ee33d918bb7dbde3e734 100644 (file)
@@ -253,8 +253,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()
@@ -700,9 +703,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
@@ -872,7 +880,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:
index 15f7f254ea9ddc870dd04f2c8c28ac8d26d4edfc..4a2ff935bec749574e2c1b61071ab5b6f5727cd7 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -37,6 +37,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #11116: any error during addition of a message to a mailbox now causes
+  a rollback, instead of leaving the mailbox partially modified.
+
 - Issue #8275: Fix passing of callback arguments with ctypes under Win64.
   Patch by Stan Mihai.