diff options
author | Phil Pennock <pdp@exim.org> | 2011-02-21 22:17:13 -0500 |
---|---|---|
committer | Phil Pennock <pdp@exim.org> | 2011-02-21 22:17:13 -0500 |
commit | 554e333ebbe0552b61604cdf8fec77f507a3ab9b (patch) | |
tree | f4f30f16b32287c58da8568c249cab344a8f602e | |
parent | 2e64baa9d155c1a657ba43cbe0f9bd4846621b36 (diff) |
Don't disable quota when maildirsize lost to races.exim-4_75_RC2
When maildir_ensure_sizefile() returns -2, we still have size
information, so we can still use that. Don't disable quota. As a
result, do refrain from potentially calling close(-2).
Fixes bug 1086
-rw-r--r-- | src/src/transports/appendfile.c | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/src/src/transports/appendfile.c b/src/src/transports/appendfile.c index e5ab65765..39dd4f8f0 100644 --- a/src/src/transports/appendfile.c +++ b/src/src/transports/appendfile.c @@ -2419,18 +2419,12 @@ else "%s/maildirsize", check_path); return FALSE; } - else if (maildirsize_fd == -2) - { - DEBUG(D_transport) debug_printf("disabling quota check because of " - "races updating %s/maildirsize", check_path); - disable_quota = TRUE; - } + /* can also return -2, which means that the file was removed because of + raciness; but in this case, the size & filecount will still have been + updated. */ - if (maildirsize_fd >= 0) - { - if (mailbox_size < 0) mailbox_size = size; - if (mailbox_filecount < 0) mailbox_filecount = filecount; - } + if (mailbox_size < 0) mailbox_size = size; + if (mailbox_filecount < 0) mailbox_filecount = filecount; } /* No quota enforcement; ensure file does *not* exist; calculate size if @@ -2927,7 +2921,8 @@ if (!disable_quota) if (yield == OK && maildirsize_fd >= 0) maildir_record_length(maildirsize_fd, message_size); maildir_save_errno = errno; /* Preserve errno while closing the file */ - (void)close(maildirsize_fd); + if (maildirsize_fd >= 0) + (void)close(maildirsize_fd); errno = maildir_save_errno; } #endif /* SUPPORT_MAILDIR */ |