Give error if overflow in quota setting in appendfile on a 32-bit
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Fri, 10 Feb 2006 16:29:20 +0000 (16:29 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Fri, 10 Feb 2006 16:29:20 +0000 (16:29 +0000)
system; make Exim output off_t size for -bV so tests can be appropriate.

15 files changed:
doc/doc-txt/ChangeLog
src/src/exim.c
src/src/globals.c
src/src/transports/appendfile.c
test/README
test/confs/5007 [new file with mode: 0644]
test/log/5007 [new file with mode: 0644]
test/mail/5005.nofile/maildirsize
test/mail/5005.userx/maildirsize
test/mail/5006.userx/maildirsize
test/mail/5007.userx/maildirsize [new file with mode: 0644]
test/mail/5007.userx/new/1.myhost.test.ex [new file with mode: 0644]
test/runtest
test/scripts/5000-maildir/5005
test/scripts/5000-maildir/5007 [new file with mode: 0644]

index a9f562b..c66ec6a 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.290 2006/02/10 14:25:43 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.291 2006/02/10 16:29:20 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -120,6 +120,15 @@ PH/20 Added $auth1, $auth2, $auth3 to contain authentication data (as well as
       $1, $2, $3) because the numerical variables can be reset during some
       expansion items (e.g. "match"), thereby losing the authentication data.
 
+PH/21 Make -bV show the size of off_t variables so that the test suite can
+      decide whether to run tests for quotas > 2G.
+
+PH/22 Test the values given for quota, quota_filecount, quota_warn_threshold,
+      mailbox_size, and mailbox_filecount in the appendfile transport. If a
+      filecount value is greater than 2G or if a quota value is greater than 2G
+      on a system where the size of off_t is not greater than 4, a panic error
+      is given.
+
 
 
 Exim version 4.60
index 87239c5..5b0eb03 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/exim.c,v 1.31 2006/02/07 11:19:00 ph10 Exp $ */
+/* $Cambridge: exim/src/src/exim.c,v 1.32 2006/02/10 16:29:20 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -1012,6 +1012,8 @@ if (fixed_never_users[0] > 0)
     fprintf(f, "%d:", (unsigned int)fixed_never_users[i]);
   fprintf(f, "%d\n", (unsigned int)fixed_never_users[i]);
   }
+
+fprintf(f, "Size of off_t: %d\n", sizeof(off_t));
 }
 
 
index e609f30..275b7c8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/globals.c,v 1.46 2006/02/10 14:25:43 ph10 Exp $ */
+/* $Cambridge: exim/src/src/globals.c,v 1.47 2006/02/10 16:29:20 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -1224,7 +1224,7 @@ uschar *warnmsg_delay          = NULL;
 uschar *warnmsg_recipients     = NULL;
 BOOL    write_rejectlog        = TRUE;
 
-uschar *version_copyright      = US"Copyright (c) University of Cambridge 2005";
+uschar *version_copyright      = US"Copyright (c) University of Cambridge 2006";
 uschar *version_date           = US"?";
 uschar *version_cnumber        = US"????";
 uschar *version_string         = US"?";
index d336ada..bb5d90b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/transports/appendfile.c,v 1.11 2006/02/07 11:19:02 ph10 Exp $ */
+/* $Cambridge: exim/src/src/transports/appendfile.c,v 1.12 2006/02/10 16:29:20 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -271,6 +271,7 @@ mailbox_filecount */
 for (i = 0; i < 5; i++)
   {
   double d;
+  uschar *which = NULL;
 
   if (q == NULL) d = default_value; else
     {
@@ -316,33 +317,49 @@ for (i = 0; i < 5; i++)
       }
     }
 
+  /* Set each value, checking for possible overflow. */
+
   switch (i)
     {
     case 0:
+    if (d >= 2.0*1024.0*1024.0*1024.0 && sizeof(off_t) <= 4) which = US"quota";
     ob->quota_value = (off_t)d;
     q = ob->quota_filecount;
     break;
 
     case 1:
+    if (d >= 2.0*1024.0*1024.0*1024.0) which = US"quota_filecount";
     ob->quota_filecount_value = (int)d;
     q = ob->quota_warn_threshold;
     break;
 
     case 2:
+    if (d >= 2.0*1024.0*1024.0*1024.0 && sizeof(off_t) <= 4)
+      which = US"quota_warn_threshold";
     ob->quota_warn_threshold_value = (off_t)d;
     q = ob->mailbox_size_string;
     default_value = -1.0;
     break;
 
     case 3:
+    if (d >= 2.0*1024.0*1024.0*1024.0 && sizeof(off_t) <= 4)
+      which = US"mailbox_size";;
     ob->mailbox_size_value = (off_t)d;
     q = ob->mailbox_filecount_string;
     break;
 
     case 4:
+    if (d >= 2.0*1024.0*1024.0*1024.0) which = US"mailbox_filecount";
     ob->mailbox_filecount_value = (int)d;
     break;
     }
+
+  if (which != NULL)
+    {
+    *errmsg = string_sprintf("%s value %.10g is too large (overflow) in "
+      "%s transport", which, d, tblock->name);
+    return FAIL;
+    }
   }
 
 return OK;
index f324788..13284ab 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/test/README,v 1.1 2006/02/06 16:07:10 ph10 Exp $
+$Cambridge: exim/test/README,v 1.2 2006/02/10 16:29:20 ph10 Exp $
 
 EXPORTABLE EXIM TEST SUITE
 --------------------------
@@ -643,6 +643,13 @@ This command must be at the head of a script. If no IPv6 interface has been
 found, the entire script is skipped, and a comment is output.
 
 
+  need_largefiles
+
+This command must be at the head of a script. If the Exim binary does not
+suppport large files (off_t is <= 4), the entire script is skipped, and a
+comment is output.
+
+
   need_move_frozen_messages
 
 This command must be at the head of a script. If the Exim binary does not have
diff --git a/test/confs/5007 b/test/confs/5007
new file mode 100644 (file)
index 0000000..a1ac93e
--- /dev/null
@@ -0,0 +1,49 @@
+# Exim test configuration 5007
+
+QUOTA=500
+
+exim_path = EXIM_PATH
+host_lookup_order = bydns
+primary_hostname = myhost.test.ex
+rfc1413_query_timeout = 0s
+spool_directory = DIR/spool
+log_file_path = DIR/spool/log/%slog
+gecos_pattern = ""
+gecos_name = CALLER_NAME
+
+
+# ----- Main settings -----
+
+delay_warning =
+qualify_domain = test.ex
+
+
+# ----- Routers -----
+
+begin routers
+
+r1:
+  driver = accept
+  transport = t1
+
+# ----- Transports -----
+
+begin transports
+
+t1:
+  driver = appendfile
+  directory = DIR/test-mail/$local_part
+  user = CALLER
+  maildir_format
+  maildir_use_size_file
+  quota = QUOTA
+
+
+# ----- Retry -----
+
+begin retry
+
+* * F,1d,1d
+
+
+# End
diff --git a/test/log/5007 b/test/log/5007
new file mode 100644 (file)
index 0000000..16e2bd4
--- /dev/null
@@ -0,0 +1,3 @@
+1999-03-02 09:44:33 10HmaX-0005vi-00 <= CALLER@test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmaX-0005vi-00 => userx <userx@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 10HmaX-0005vi-00 Completed
diff --git a/test/mail/5007.userx/maildirsize b/test/mail/5007.userx/maildirsize
new file mode 100644 (file)
index 0000000..496f0f6
--- /dev/null
@@ -0,0 +1,3 @@
+3221225472S,0C
+ddd d
+ddd d
diff --git a/test/mail/5007.userx/new/1.myhost.test.ex b/test/mail/5007.userx/new/1.myhost.test.ex
new file mode 100644 (file)
index 0000000..c077e2b
--- /dev/null
@@ -0,0 +1,9 @@
+Received: from CALLER by myhost.test.ex with local (Exim x.yz)
+       (envelope-from <CALLER@test.ex>)
+       id 10HmaX-0005vi-00
+       for userx@test.ex; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmaX-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+Test message
index 2210cba..d5a1612 100755 (executable)
@@ -1,6 +1,6 @@
 #! /usr/bin/perl -w
 
-# $Cambridge: exim/test/runtest,v 1.3 2006/02/09 14:50:58 ph10 Exp $
+# $Cambridge: exim/test/runtest,v 1.4 2006/02/10 16:29:20 ph10 Exp $
 
 ###############################################################################
 # This is the controlling script for the "new" test suite for Exim. It should #
@@ -36,6 +36,7 @@ $server_opts = "";
 
 $have_ipv4 = 1;
 $have_ipv6 = 1;
+$have_largefiles = 0;
 
 $test_start = 1;
 $test_end = $test_top = 8999;
@@ -614,7 +615,7 @@ while(<IN>)
   # Maildirsize data
   if (/^\d+S,\d+C\s*$/)
     {
-    print MUNGED "dddS,dC\n";
+    print MUNGED;
     while (<IN>)
       {
       last if !/^\d+ \d+\s*$/;
@@ -788,7 +789,8 @@ while(<IN>)
                 /^Transports:/ ||
                 /^log selectors =/ ||
                 /^cwd=/ ||
-                /^Fixed never_users:/
+                /^Fixed never_users:/ ||
+                /^Size of off_t:/
                 );
       }
 
@@ -1459,7 +1461,7 @@ if (/^sleep\s+(.*)$/)
 
 # Various Unix management commands are recognized
 
-if (/^(ln|ls|du|mkdir|mkfifo|touch|cp)\s/ ||
+if (/^(ln|ls|du|mkdir|mkfifo|touch|cp|cat)\s/ ||
     /^sudo (rmdir|rm|chown|chmod)\s/)
   {
   run_system("$_ >>test-stdout 2>>test-stderr");
@@ -1952,9 +1954,14 @@ while (<EXIMINFO>)
   {
   my(@temp);
 
-  if (/^Exim version/) { print; next; }
+  if (/^Exim version/) { print; }
 
-  if (/^Support for: (.*)/)
+  elsif (/^Size of off_t: (\d+)/)
+    {
+    $have_largefiles = 1 if $1 > 4;
+    }
+
+  elsif (/^Support for: (.*)/)
     {
     print;
     @temp = split /(\s+)/, $1;
@@ -1962,7 +1969,7 @@ while (<EXIMINFO>)
     %parm_support = @temp;
     }
 
-  if (/^Lookups: (.*)/)
+  elsif (/^Lookups: (.*)/)
     {
     print;
     @temp = split /(\s+)/, $1;
@@ -1970,7 +1977,7 @@ while (<EXIMINFO>)
     %parm_lookups = @temp;
     }
 
-  if (/^Authenticators: (.*)/)
+  elsif (/^Authenticators: (.*)/)
     {
     print;
     @temp = split /(\s+)/, $1;
@@ -1978,7 +1985,7 @@ while (<EXIMINFO>)
     %parm_authenticators = @temp;
     }
 
-  if (/^Routers: (.*)/)
+  elsif (/^Routers: (.*)/)
     {
     print;
     @temp = split /(\s+)/, $1;
@@ -1990,7 +1997,7 @@ while (<EXIMINFO>)
   # that the basic transport name is set, and then the name with each of the
   # options.
 
-  if (/^Transports: (.*)/)
+  elsif (/^Transports: (.*)/)
     {
     print;
     @temp = split /(\s+)/, $1;
@@ -2853,6 +2860,15 @@ foreach $test (@test_list)
       if (/^rmfiltertest/)     { $rmfiltertest = 1; next; }
       if (/^sortlog/)          { $sortlog = 1; next; }
 
+      if (/^need_largefiles/)
+        {
+        next if $have_largefiles;
+        print ">>> Large file support is needed for test $testno, but is not available: skipping\n";
+        $docheck = 0;      # don't check output
+        undef $_;          # pretend EOF
+        last;
+        }
+
       if (/^need_ipv4/)
         {
         next if $have_ipv4;
index ea7ccc3..a816245 100644 (file)
@@ -1,4 +1,4 @@
-# maildir with maildirsize for quota handling
+# maildirsize for quota handling
 exim -d -odi nofile@test.ex
 Message for nofile
 ****
diff --git a/test/scripts/5000-maildir/5007 b/test/scripts/5000-maildir/5007
new file mode 100644 (file)
index 0000000..e9c8ee4
--- /dev/null
@@ -0,0 +1,7 @@
+# maildirsize for quota handling quota > 2G
+need_largefiles
+# Set a quota that is greater than 2G
+exim -DQUOTA=3G -odi userx@test.ex
+Test message
+****
+no_msglog_check