summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Hazel <ph10@hermes.cam.ac.uk>2004-11-12 11:28:15 +0000
committerPhilip Hazel <ph10@hermes.cam.ac.uk>2004-11-12 11:28:15 +0000
commit62c0818fac14b6e6ceecef3c655c09f8eb26ff57 (patch)
tree52e867aed6bf63e823efb804ba5a1bfee7ae5e28
parent7d468ab86e8d0efcee1ccf8c715094699a157f28 (diff)
downloadexim4-62c0818fac14b6e6ceecef3c655c09f8eb26ff57.tar.gz
Recalculate maildirsize data if either of the totals comes out negative,
as this indicates a broken file.
-rw-r--r--doc/doc-txt/ChangeLog7
-rw-r--r--src/src/transports/tf_maildir.c15
2 files changed, 18 insertions, 4 deletions
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index f76f22a32..3be581e3a 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.23 2004/11/11 16:03:47 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.24 2004/11/12 11:28:15 ph10 Exp $
Change log file for Exim from version 4.21
-------------------------------------------
@@ -94,6 +94,11 @@ Exim version 4.44
SIGCHLD signals. This is not a major problem, because they are used only to
wake it up if nothing else does.
+26. A malformed maildirsize file could cause Exim to calculate negative values
+ for the mailbox size or file count. Odd effects could occur as a result.
+ The maildirsize information is now recalculated if the size or filecount
+ end up negative.
+
Exim version 4.43
-----------------
diff --git a/src/src/transports/tf_maildir.c b/src/src/transports/tf_maildir.c
index bf0aa1572..f18c91671 100644
--- a/src/src/transports/tf_maildir.c
+++ b/src/src/transports/tf_maildir.c
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/transports/tf_maildir.c,v 1.1 2004/10/07 13:10:02 ph10 Exp $ */
+/* $Cambridge: exim/src/src/transports/tf_maildir.c,v 1.2 2004/11/12 11:28:15 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -430,10 +430,19 @@ while (*endptr++ == '\n')
/* If *endptr is zero, we have successfully parsed the file, and we now have
the size of the mailbox as cached in the file. The "rules" say that if this
value indicates that the mailbox is over quota, we must recalculate if there is
-more than one entry in the file, or if the file is older than 15 minutes. */
+more than one entry in the file, or if the file is older than 15 minutes. Also,
+just in case there are weird values in the file, recalculate if either of the
+values is negative. */
if (*endptr == 0)
{
+ if (size < 0 || filecount < 0)
+ {
+ DEBUG(D_transport) debug_printf("negative value in maildirsize "
+ "(size=%d count=%d): recalculating\n", size, filecount);
+ goto RECALCULATE;
+ }
+
if (ob->quota_value > 0 &&
(size + (ob->quota_is_inclusive? message_size : 0) > ob->quota_value ||
(ob->quota_filecount_value > 0 &&
@@ -444,7 +453,7 @@ if (*endptr == 0)
struct stat statbuf;
if (linecount > 1)
{
- DEBUG(D_transport) debug_printf("over quota and maildirsizefile has "
+ DEBUG(D_transport) debug_printf("over quota and maildirsize has "
"more than 1 entry: recalculating\n");
goto RECALCULATE;
}