*** empty log message ***
authorMatthew Mondor <mmondor@pulsar-zone.net>
Sun, 30 Mar 2003 21:06:01 +0000 (21:06 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Sun, 30 Mar 2003 21:06:01 +0000 (21:06 +0000)
mmsoftware/mmmail/src/mmsmtpd/mmsmtpd.c
mmsoftware/mmmail/src/mmsmtpd/mmsmtpd.h

index 512fafd..65412a3 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.c,v 1.12 2003/03/28 21:09:29 mmondor Exp $ */
+/* $Id: mmsmtpd.c,v 1.13 2003/03/30 21:06:00 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2003, Matthew Mondor
@@ -74,7 +74,7 @@
 
 MMCOPYRIGHT("@(#) Copyright (c) 2002-2003\n\
 \tMatthew Mondor. All rights reserved.\n");
-MMRCSID("$Id: mmsmtpd.c,v 1.12 2003/03/28 21:09:29 mmondor Exp $");
+MMRCSID("$Id: mmsmtpd.c,v 1.13 2003/03/30 21:06:00 mmondor Exp $");
 
 
 
@@ -1199,15 +1199,15 @@ local_address(const char *address, long *maxsize, long *size, long *maxmsgs,
 }
 
 
-/* Fills str which should be at least 32 bytes in lenght with current time */
+/* Fills str which should be at least 32 bytes in length with current time */
 static void
 rfc_time(char *str)
 {
     /* Thu, 07 Dec 2000 07:36:15 -0000 */
-    char *days[] = {
+    const static char *days[] = {
        "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
     };
-    char *months[] = {
+    const static char *months[] = {
        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
     };
@@ -1231,23 +1231,25 @@ rfc_time(char *str)
 static bool
 valid_address(clientenv *clenv, char *to, char *addr, int res)
 {
-    char *ptr, *ptr2;
+    char *ptr, *a, *h;
 
     mm_strlower(addr);
 
     /* First locate required @ */
     for (ptr = addr; *ptr && *ptr != '@'; ptr++) ;
     if (!*ptr) return (FALSE);
-
+    h = ptr + 1;
     /* Then scan to the left */
-    for (ptr2 = (ptr - 1); ptr2 >= addr && valid_char(*ptr2); ptr2--) ;
-    if (ptr2 == (ptr - 1)) return (FALSE);
-    ptr2++;
-
+    for (ptr--; ptr >= addr && VALID_CHAR(*ptr); ptr--) ;
+    if (h - ptr < 3 || ptr < addr) return (FALSE);
+    a = ++ptr;
+    /* Now to the right */
+    for (ptr = h; *ptr && VALID_CHAR(*ptr); ptr++) ;
+    if (ptr - h < 2) return (FALSE);
+    *ptr = '\0';
     /* Now validate hostname part */
-    ptr++;
-    if (valid_host(clenv, ptr, res, FALSE)) {
-       mm_strncpy(to, ptr2, 63);
+    if (valid_host(clenv, h, res, FALSE)) {
+       mm_strncpy(to, a, 63);
        return (TRUE);
     }
 
@@ -1265,7 +1267,7 @@ valid_host(clientenv *clenv, char *host, int res, bool addr)
     mm_strlower(host);
     /* First make sure all characters are valid */
     for (ptr = host; *ptr; ptr++)
-       if (!valid_char(*ptr)) return (FALSE);
+       if (!VALID_CHAR(*ptr)) return (FALSE);
 
     /* Now verify that all parts of the hostname are starting with
      * an alphanumeric char
@@ -1306,24 +1308,6 @@ valid_host(clientenv *clenv, char *host, int res, bool addr)
 }
 
 
-/* A useful function which returns wether or not a character is valid
- * in an email address or hostname
- */
-static bool
-valid_char(char c)
-{
-    char allow[] = "abcdefghijklmnopqrstuvwxyz1234567890.-_", *ptr = allow;
-
-    while (*ptr) {
-       if (*ptr == c)
-           return (TRUE);
-       ptr++;
-    }
-
-    return (FALSE);
-}
-
-
 /* Some more parsing magic for IP address sanity checking */
 static bool
 valid_ipaddress(const char *addr)
index 4e412f0..15537f5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.h,v 1.9 2003/03/28 21:09:29 mmondor Exp $ */
+/* $Id: mmsmtpd.h,v 1.10 2003/03/30 21:06:01 mmondor Exp $ */
 
 /*
  * Copyright (C) 2000-2003, Matthew Mondor
 #define ASYNC_RESQUERY 1
 
 /* Error registration macro */
-#define REGISTER_ERROR(x) do { \
+#define REGISTER_ERROR(x)      do { \
     (x)->errors++; \
        if (CONF.DELAY_ON_ERROR) \
            pth_sleep((x)->errors); \
-} while(0)
+} 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) == '_')
 
 
 
@@ -239,7 +242,6 @@ static bool local_address(const char *, long *, long *, long *, long *);
 static void rfc_time(char *);
 static bool valid_address(clientenv *, char *, char *, int);
 static bool valid_host(clientenv *, char *, int, bool);
-static bool valid_char(char);
 static bool valid_ipaddress(const char *);
 
 static int validate_msg_line(char *, ssize_t *, int *, void *);