Now allows '=' characters in hostnames and mail addresses. Should ideally
authorMatthew Mondor <mmondor@pulsar-zone.net>
Sat, 26 Mar 2005 10:50:49 +0000 (10:50 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Sat, 26 Mar 2005 10:50:49 +0000 (10:50 +0000)
only be allowed in the username part of the email address though.
Also improved efficiency of valid_address() by using a table lookup for
allowed characters instead of needing explicit comparisions in the
VALID_CHAR() macro (which now has been renamed to VALID_ADDR_CHAR()).
I needed '=' character support as an emergency measure against spam I
receive on my mailing lists address. I can now set a deny by default rule
and explicitely allow mail originating from the netbsd mailing lists. These
use a MAIL FROM: containing an address with a '=' character, possibly a
default with majordomo managed mailing lists...

mmsoftware/mmmail/src/mmsmtpd/mmsmtpd.c
mmsoftware/mmmail/src/mmsmtpd/mmsmtpd.h

index 6861f2e..5164b01 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.c,v 1.70 2005/03/26 10:44:29 mmondor Exp $ */
+/* $Id: mmsmtpd.c,v 1.71 2005/03/26 10:50:49 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2004, Matthew Mondor
@@ -82,7 +82,7 @@
 
 MMCOPYRIGHT("@(#) Copyright (c) 2001-2004\n\
 \tMatthew Mondor. All rights reserved.\n");
-MMRCSID("$Id: mmsmtpd.c,v 1.70 2005/03/26 10:44:29 mmondor Exp $");
+MMRCSID("$Id: mmsmtpd.c,v 1.71 2005/03/26 10:50:49 mmondor Exp $");
 
 
 
@@ -195,6 +195,28 @@ static fdfuncs gfdf = {
 };
 
 /*
+ * Used to speed up VALID_ADDR_CHAR()
+ */
+static const unsigned char valid_addr_char_table[256] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
+};
+
+/*
  * Connection to mmrelayd(8) establishment
  */
 int            relayd_sock = -1;
@@ -1498,12 +1520,12 @@ valid_address(clientenv *clenv, char *to, char *addr, int res)
        return (FALSE);
     h = ptr + 1;
     /* Then scan to the left */
-    for (ptr--; ptr >= addr && VALID_CHAR(*ptr); ptr--) ;
+    for (ptr--; ptr >= addr && VALID_ADDR_CHAR(*ptr); ptr--) ;
     if (h - ptr < 3 || ptr < addr)
        return (FALSE);
     a = ++ptr;
     /* Now to the right */
-    for (ptr = h; *ptr != '\0' && VALID_CHAR(*ptr); ptr++) ;
+    for (ptr = h; *ptr != '\0' && VALID_ADDR_CHAR(*ptr); ptr++) ;
     if (ptr - h < 2)
        return (FALSE);
     *ptr = '\0';
@@ -1531,7 +1553,7 @@ valid_host(clientenv *clenv, char *host, int res, bool addr, bool sanity)
 
        /* First make sure all characters are valid */
        for (ptr = host; *ptr != '\0'; ptr++)
-           if (!VALID_CHAR(*ptr))
+           if (!VALID_ADDR_CHAR(*ptr))
                return FALSE;
 
        /* Now verify that all parts of the hostname are starting with
index 815ffe5..e483258 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.h,v 1.31 2005/03/26 10:44:29 mmondor Exp $ */
+/* $Id: mmsmtpd.h,v 1.32 2005/03/26 10:50:49 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2004, Matthew Mondor
@@ -114,12 +114,13 @@ enum data_reason {
 } while(FALSE)
 
 /* Evaluates if a character is valid for addresses and hostnames */
-#define VALID_CHAR(c)          (((c) >= 'a' && (c) <= 'z') || \
-       ((c) >= '0' && (c) <= '9') || (c) == '.' || (c) == '-' || (c) == '_')
+#define VALID_ADDR_CHAR(c)     \
+   (valid_addr_char_table[(int)((unsigned char)(c))] != 0)
 
 
 
 /* STRUCTURES */
+
 /* We store config file read results in this structure */
 typedef struct config {
     char LOCK_PATH[256], CHROOT_DIR[256], PID_PATH[256], USER[32], GROUPS[256],