From: Petri Lehtinen Date: Fri, 29 Jun 2012 12:09:12 +0000 (+0300) Subject: #5346: Preserve permissions of mbox, MMDF and Babyl mailbox files on flush() X-Git-Tag: v2.7.4rc1~734 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d07de404907b7eab1796b9065ff6bcc3de14c4fc;p=python #5346: Preserve permissions of mbox, MMDF and Babyl mailbox files on flush() --- diff --git a/Lib/mailbox.py b/Lib/mailbox.py index fc154fa12a..61683674ff 100644 --- a/Lib/mailbox.py +++ b/Lib/mailbox.py @@ -665,6 +665,9 @@ class _singlefileMailbox(Mailbox): _sync_close(new_file) # self._file is about to get replaced, so no need to sync. self._file.close() + # Make sure the new file's mode is the same as the old file's + mode = os.stat(self._path).st_mode + os.chmod(new_file.name, mode) try: os.rename(new_file.name, self._path) except OSError, e: diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py index a8c692b981..d479bf85f1 100644 --- a/Lib/test/test_mailbox.py +++ b/Lib/test/test_mailbox.py @@ -848,6 +848,23 @@ class _TestSingleFile(TestMailbox): self._box = self._factory(self._path) self.assertEqual(len(self._box), 1) + def test_permissions_after_flush(self): + # See issue #5346 + + # Make the mailbox world writable. It's unlikely that the new + # mailbox file would have these permissions after flush(), + # because umask usually prevents it. + mode = os.stat(self._path).st_mode | 0o666 + os.chmod(self._path, mode) + + self._box.add(self._template % 0) + i = self._box.add(self._template % 1) + # Need to remove one message to make flush() create a new file + self._box.remove(i) + self._box.flush() + + self.assertEqual(os.stat(self._path).st_mode, mode) + class _TestMboxMMDF(_TestSingleFile): diff --git a/Misc/NEWS b/Misc/NEWS index 09ea7e3b9d..9839903dfd 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -75,6 +75,9 @@ Core and Builtins Library ------- +- Issue #5346: Preserve permissions of mbox, MMDF and Babyl mailbox + files on flush(). + - Issue #15219: Fix a reference leak when hashlib.new() is called with invalid parameters.