You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by jm...@apache.org on 2006/04/03 17:18:05 UTC

svn commit: r391067 - in /spamassassin/trunk/spamc: libspamc.c libspamc.h utils.h

Author: jm
Date: Mon Apr  3 08:18:03 2006
New Revision: 391067

URL: http://svn.apache.org/viewcvs?rev=391067&view=rev
Log:
bug 4593: revert changes made for bug 3452, where some spamc vars were made unsigned, resulting in infinite loop caused by an error condition in spamc

Modified:
    spamassassin/trunk/spamc/libspamc.c
    spamassassin/trunk/spamc/libspamc.h
    spamassassin/trunk/spamc/utils.h

Modified: spamassassin/trunk/spamc/libspamc.c
URL: http://svn.apache.org/viewcvs/spamassassin/trunk/spamc/libspamc.c?rev=391067&r1=391066&r2=391067&view=diff
==============================================================================
--- spamassassin/trunk/spamc/libspamc.c (original)
+++ spamassassin/trunk/spamc/libspamc.c Mon Apr  3 08:18:03 2006
@@ -500,7 +500,7 @@
 	return EX_IOERR;
     }
     m->type = MESSAGE_ERROR;
-    if (m->raw_len > m->max_len)
+    if (m->raw_len > (int) m->max_len)
     {
         libspamc_log(m->priv->flags, LOG_ERR,
                 "skipped message, greater than max message size (%d bytes)",
@@ -534,7 +534,7 @@
 	return EX_IOERR;
     }
     m->type = MESSAGE_ERROR;
-    if (m->raw_len > m->max_len)
+    if (m->raw_len > (int) m->max_len)
 	return EX_TOOBIG;
     p = m->pre = m->raw;
     /* Search for \nDATA\n which marks start of actual message */
@@ -555,15 +555,20 @@
 	  break;
 	}
       }
-      p = q; // the above code ensures no other '\n' comes before q
+      p = q; /* the above code ensures no other '\n' comes before q */
     }
     if (m->msg == NULL)
 	return EX_DATAERR;
 
+    /* ensure this is >= 0 */
+    if (m->msg_len < 0) {
+	return EX_SOFTWARE;
+    }
+
     /* Find the end-of-DATA line */
     /* if bad format with no end ".\n" will truncate the last two characters of the buffer */
     prev = '\n';
-    for (i = j = 0; (i+2) < m->msg_len; i++) { /* (i+2) prevents out of bound reference msg[i+2] */
+    for (i = j = 0; (i+2) < (unsigned int) m->msg_len; i++) { /* (i+2) prevents out of bound reference msg[i+2] */
 	if (prev == '\n' && m->msg[i] == '.') {
 	    /* Dot at the beginning of a line */
 	    if ((m->msg[i + 1] == '\r' && m->msg[i + 2] == '\n')
@@ -963,7 +968,7 @@
 	_use_msg_for_out(m);
 	return EX_OSERR;
       }
-      len += sprintf(buf + len, "Content-length: %d\r\n\r\n", m->msg_len);
+      len += sprintf(buf + len, "Content-length: %d\r\n\r\n", (int) m->msg_len);
     }
 
     libspamc_timeout = m->timeout;
@@ -1140,7 +1145,13 @@
 
     m.type = MESSAGE_NONE;
 
-    m.max_len = max_size;
+    /* enforce max_size being unsigned, therefore >= 0 */
+    if (max_size < 0) {
+	ret = EX_SOFTWARE;
+        goto FAIL;
+    }
+    m.max_len = (unsigned int) max_size;
+
     ret = message_read(in_fd, flags, &m);
     if (ret != EX_OK)
         goto FAIL;
@@ -1284,7 +1295,7 @@
 	_use_msg_for_out(m);
 	return EX_OSERR;
     }
-    len += sprintf(buf + len, "Content-length: %d\r\n\r\n", m->msg_len);
+    len += sprintf(buf + len, "Content-length: %d\r\n\r\n", (int) m->msg_len);
 
     libspamc_timeout = m->timeout;
 
@@ -1487,7 +1498,7 @@
     char **addrp;
 
 #ifdef _WIN32
-    // Start Winsock up
+    /* Start Winsock up */
     WSADATA wsaData;
     int nCode;
     if ((nCode = WSAStartup(MAKEWORD(1, 1), &wsaData)) != 0) {
@@ -1646,11 +1657,11 @@
     va_start(ap, msg);
 
     if ((flags & SPAMC_LOG_TO_STDERR) != 0) {
-        // create a log-line buffer
+        /* create a log-line buffer */
         len = snprintf(buf, LOG_BUFSIZ, "spamc: ");
         len += vsnprintf(buf+len, LOG_BUFSIZ-len, msg, ap);
 
-        // avoid buffer overflow
+        /* avoid buffer overflow */
         if (len > (LOG_BUFSIZ-2)) { len = (LOG_BUFSIZ-3); }
 
         len += snprintf(buf+len, LOG_BUFSIZ-len, "\n");

Modified: spamassassin/trunk/spamc/libspamc.h
URL: http://svn.apache.org/viewcvs/spamassassin/trunk/spamc/libspamc.h?rev=391067&r1=391066&r2=391067&view=diff
==============================================================================
--- spamassassin/trunk/spamc/libspamc.h (original)
+++ spamassassin/trunk/spamc/libspamc.h Mon Apr  3 08:18:03 2006
@@ -137,11 +137,12 @@
     /* Filled in by message_read */
     message_type_t type;
     char *raw;
-    unsigned int raw_len;		/* Raw message buffer */
+    int raw_len;		/* Raw message buffer */
+    /* note: do not make "raw_len" in particular unsigned! see bug 4593 */
     char *pre;
     int pre_len;		/* Pre-message data (e.g. SMTP commands) */
     char *msg;
-    unsigned int msg_len;		/* The message */
+    int msg_len;		/* The message */
     char *post;
     int post_len;		/* Post-message data (e.g. SMTP commands) */
     int content_length;

Modified: spamassassin/trunk/spamc/utils.h
URL: http://svn.apache.org/viewcvs/spamassassin/trunk/spamc/utils.h?rev=391067&r1=391066&r2=391067&view=diff
==============================================================================
--- spamassassin/trunk/spamc/utils.h (original)
+++ spamassassin/trunk/spamc/utils.h Mon Apr  3 08:18:03 2006
@@ -37,9 +37,9 @@
 
 #ifdef _WIN32
 #include <winsock.h>
-//
-// BSD-compatible socket error codes for Win32
-//
+/*
+ * BSD-compatible socket error codes for Win32
+ */
 
 #define EWOULDBLOCK             WSAEWOULDBLOCK
 #define EINPROGRESS             WSAEINPROGRESS
@@ -69,17 +69,17 @@
 #define ETIMEDOUT               WSAETIMEDOUT
 #define ECONNREFUSED            WSAECONNREFUSED
 #define ELOOP                   WSAELOOP
-// #define ENAMETOOLONG            WSAENAMETOOLONG
+/* #define ENAMETOOLONG            WSAENAMETOOLONG */
 #define EHOSTDOWN               WSAEHOSTDOWN
 #define EHOSTUNREACH            WSAEHOSTUNREACH
-// #define ENOTEMPTY               WSAENOTEMPTY
+/* #define ENOTEMPTY               WSAENOTEMPTY */
 #define EPROCLIM                WSAEPROCLIM
 #define EUSERS                  WSAEUSERS
 #define EDQUOT                  WSAEDQUOT
 #define ESTALE                  WSAESTALE
 #define EREMOTE                 WSAEREMOTE
 
-// NOTE: these are not errno constants in UNIX!
+/* NOTE: these are not errno constants in UNIX! */
 #define HOST_NOT_FOUND          WSAHOST_NOT_FOUND
 #define TRY_AGAIN               WSATRY_AGAIN
 #define NO_RECOVERY             WSANO_RECOVERY