(original) (raw)
changeset: 85747:041caa64486b branch: 2.7 parent: 85736:48be42b94381 user: R David Murray rdmurray@bitdance.com date: Wed Sep 18 08:35:45 2013 -0400 files: Lib/mailbox.py Misc/NEWS description: #19037: adjust file times *before* moving maildir files into place. This avoids race conditions when other programs are monitoring the maildir directory. Patch by janzert. diff -r 48be42b94381 -r 041caa64486b Lib/mailbox.py --- a/Lib/mailbox.py Tue Sep 17 20:10:23 2013 -0400 +++ b/Lib/mailbox.py Wed Sep 18 08:35:45 2013 -0400 @@ -286,6 +286,12 @@ suffix = '' uniq = os.path.basename(tmp_file.name).split(self.colon)[0] dest = os.path.join(self._path, subdir, uniq + suffix) + if isinstance(message, MaildirMessage): + os.utime(tmp_file.name, + (os.path.getatime(tmp_file.name), message.get_date())) + # No file modification should be done after the file is moved to its + # final position in order to prevent race conditions with changes + # from other programs try: if hasattr(os, 'link'): os.link(tmp_file.name, dest) @@ -299,8 +305,6 @@ % dest) else: raise - if isinstance(message, MaildirMessage): - os.utime(dest, (os.path.getatime(dest), message.get_date())) return uniq def remove(self, key): @@ -335,11 +339,15 @@ else: suffix = '' self.discard(key) + tmp_path = os.path.join(self._path, temp_subpath) new_path = os.path.join(self._path, subdir, key + suffix) - os.rename(os.path.join(self._path, temp_subpath), new_path) if isinstance(message, MaildirMessage): - os.utime(new_path, (os.path.getatime(new_path), - message.get_date())) + os.utime(tmp_path, + (os.path.getatime(tmp_path), message.get_date())) + # No file modification should be done after the file is moved to its + # final position in order to prevent race conditions with changes + # from other programs + os.rename(tmp_path, new_path) def get_message(self, key): """Return a Message representation or raise a KeyError.""" diff -r 48be42b94381 -r 041caa64486b Misc/NEWS --- a/Misc/NEWS Tue Sep 17 20:10:23 2013 -0400 +++ b/Misc/NEWS Wed Sep 18 08:35:45 2013 -0400 @@ -32,6 +32,10 @@ Library ------- +- Issue #19037: The mailbox module now makes all changes to maildir files + before moving them into place, to avoid race conditions with other programs + that may be accessing the maildir directory. + - Issue #14984: On POSIX systems, when netrc is called without a filename argument (and therefore is reading the user's $HOME/.netrc file), it now enforces the same security rules as typical ftp clients: the .netrc file must /rdmurray@bitdance.com