bogofilter -Q

Matthias Andree matthias.andree at gmx.de
Fri Aug 29 14:08:17 CEST 2003


On Thu, 28 Aug 2003, jxz wrote:

> I just use bogofilter with its default configuration. What's that
> garbage in spamicity_tags?

Fixed in CVS, try this patch (it also adds %D to format strings that
formats ISO-8601 date in UTC, for tracing filtering):

Index: src/format.c
===================================================================
RCS file: /cvsroot/bogofilter/bogofilter/src/format.c,v
retrieving revision 1.17
retrieving revision 1.19
diff -u -r1.17 -r1.19
--- src/format.c	19 Aug 2003 12:42:26 -0000	1.17
+++ src/format.c	29 Aug 2003 12:05:44 -0000	1.19
@@ -1,4 +1,4 @@
-/* $Id: format.c,v 1.17 2003/08/19 12:42:26 relson Exp $ */
+/* $Id: format.c,v 1.19 2003/08/29 12:05:44 m-a Exp $ */
 
 /*****************************************************************************
 
@@ -56,6 +56,8 @@
 **
 **	    c - classification, e.g. Yes/No, Spam/Ham/Unsure, +/-/?
 **
+**	    D - date, fixed ISO-8601 format for Universal Time ("GMT")
+**
 **	    e - spamicity as 'e' format
 **	    f - spamicity as 'f' format
 **	    g - spamicity as 'g' format
@@ -76,16 +78,15 @@
 const char *log_header_format = "%h: %c, spamicity=%p, version=%v";
 const char *log_update_format = "register-%r, %w words, %m messages";
 
-#define	RC_COUNT RC_UNSURE+1	/* 3 (for Spam/Ham/Unsure) */
-
 typedef const char *FIELD;
-typedef FIELD FIELDS[RC_COUNT];
 
-FIELDS spamicity_tags_ynu = { "Yes",  "No",  "Unsure" };
-FIELDS spamicity_tags_shu = { "Spam", "Ham", "Unsure" };
+#define RC_COUNT 3
+static FIELD spamicity_tags_ynu[] = { "Yes",  "No",  "Unsure" };
+static FIELD spamicity_tags_shu[] = { "Spam", "Ham", "Unsure" };
+static FIELD spamicity_format_d[] = { "%0.6f", "%0.6f", "%0.6f"  };
 
 FIELD  *spamicity_tags    = spamicity_tags_ynu;
-FIELDS spamicity_formats = { "%0.6f", "%0.6f", "%0.6f"  };
+FIELD  *spamicity_formats = spamicity_format_d;
 
 static bool set_spamicity_tags(const unsigned char *val);
 static bool set_spamicity_formats(const unsigned char *val);
@@ -172,6 +173,24 @@
     return ok;
 }
 
+static size_t format_date(char *dest, const char *destend)
+{
+    struct tm *tm;
+    time_t t;
+    size_t l;
+
+    /* must check, size_t will wrap to INT_MAX or LONG_MAX otherwise */
+    if (dest == destend)
+	return 0;
+
+    (void)time(&t);
+    tm = gmtime(&t);
+    l = strftime(dest, (size_t)(destend - dest - 1), "%Y-%m-%dT%H:%M:%SZ", tm);
+    if (l + 1 >= (size_t)(destend - dest)) /* sanitize return */
+	l = 0;
+    return l;
+}
+
 static size_t format_float(char *dest, double src, 
 	int min, int prec, int flags, const char *destend)
 {
@@ -202,7 +221,7 @@
 {
     size_t s_len = strlen(src);
     int len;
-    if (s_len > INT_MAX) {
+    if (s_len > (size_t)INT_MAX) {
 	fprintf(stderr, "cannot handle string length (%lu) above %d, aborting\n", (unsigned long)s_len, INT_MAX);
 	internal_error;
     }
@@ -225,7 +244,9 @@
 static size_t format_spamicity(char *dest, const char *fmt, double spamicity, const char *destend)
 {
     char temp[20];
-    size_t len = sprintf(temp, fmt, spamicity);
+    size_t len = snprintf(temp, sizeof(temp), fmt, spamicity);
+    if (len > INT_MAX)
+	len = INT_MAX; /* clamp */
     len = format_string(dest, temp, 0, len, 0, destend);
     return len;
 }
@@ -252,7 +273,8 @@
     char temp[20];
 
     int state = S_DEFAULT;
-    size_t min = 0, prec = 0;
+    int min = 0;
+    int prec = 0;
     int flags = 0;
 
     rc_t status = method->status();
@@ -336,6 +358,12 @@
 		buff += format_spamicity(buff, f, spamicity, end);
 		break;
 	    }
+	    case 'D':		/* D - date in ISO8601 format for GMT time zone */
+	    {
+		buff += format_date(buff, end);
+		break;
+	    }
+
 	    case 'p':		/* p - spamicity as a probability */
 	    {
 		const char *f = spamicity_formats[status];




More information about the Bogofilter mailing list