--- spam.module-2.0.12pre	2005-09-21 17:59:51.000000000 -0500
+++ spam.module	2005-09-23 09:56:00.000000000 -0500
@@ -958,8 +969,21 @@
 {
   foreach ($tokens as $token) {
     $old = db_fetch_object(db_query("SELECT spam,notspam FROM {spam_tokens} WHERE token = '%s'", $token));
-    if ($old->spam || $old->notspam) {
+    if ($old) {
       // updating an existing token
+
+      // Sanity check spam/notspam values and log a warning
+      if($old->spam < 0) {
+	watchdog('spam', t('Spam: <b>WARNING:</b> tokens_save spam <0 on "%token".',
+			   array('%token' => "<tt>$token</tt>") ));
+	$old->spam = 0;
+      }
+      if($old->notspam < 0) {
+	watchdog('spam', t('Spam: <b>WARNING:</b> tokens_save notspam <0 on "%token".',
+			   array('%token' => "<tt>$token</tt>") ));
+	$old->notspam = 0;
+      }
+
       $total = $old->spam + $old->notspam + 1;
       $probability = ($old->spam + ($is_spam ? 1 : 0)) / $total * 100;
       $probability = spam_get_probability($probability);
@@ -982,21 +1006,48 @@
 {
   foreach ($tokens as $token) {
     $old = db_fetch_object(db_query("SELECT spam,notspam FROM {spam_tokens} WHERE token = '%s'", $token));
-    if ($old->spam || $old->notspam) {
+    if ($old) {
       // updating an existing token
+
+      // Sanity check existing values
+      if($old->spam < 0) {
+	$old->spam = 0;
+  	watchdog('spam', t('Spam: <b>WARNING:</b> tokens_unsave spam <0 on "%token".',
+			   array('%token' => "<tt>$token</tt>") ));
+      }
+      if($old->notspam < 0) {
+	$old->notspam = 0;
+  	watchdog('spam', t('Spam: <b>WARNING:</b> tokens_unsave notspam <0 on "%token".',
+			   array('%token' => "<tt>$token</tt>") ));
+      }
+
       $total = $old->spam + $old->notspam - 1;
-      if ($total == 0) {
-        $probability = 0;
+      if ($total <= 0) {
+        $probability = 1;
+	watchdog('spam', t('Spam: <b>WARNING:</b> tokens_unsave total <0 on "%token".',
+			   array('%token' => "<tt>$token</tt>") ));
       }
       else {
         $probability = $old->spam - ($is_spam ? 1 : 0) / $total * 100;
         $probability = spam_get_probability($probability);
       }
       if ($is_spam) {
-        db_query("UPDATE {spam_tokens} SET notspam = notspam - 1, probability = %d, last = %d WHERE token = '%s'", $probability, time(), $token);
+        $newnotspam = $old->notspam - 1;
+	if($newnotspam < 0) {
+	  $newnotspam = 0;
+  	  watchdog('spam', t('Spam: <b>WARNING:</b> tokens_unsave new notspam <0 on "%token".',
+			     array('%token' => "<tt>$token</tt>") ));
+	}
+        db_query("UPDATE {spam_tokens} SET notspam = %d, probability = %d, last = %d WHERE token = '%s'", $newnotspam, $probability, time(), $token);
       }
       else {
-        db_query("UPDATE {spam_tokens} SET spam = spam - 1, probability = %d, last = %d WHERE token = '%s'", $probability, time(), $token);
+        $newspam = $old->spam - 1;
+	if($newspam < 0) {
+	  $newspam = 0;
+  	  watchdog('spam', t('Spam: <b>WARNING:</b> tokens_unsave new spam <0 on "%token".',
+			     array('%token' => "<tt>$token</tt>") ));
+	}
+        db_query("UPDATE {spam_tokens} SET spam = %d, probability = %d, last = %d WHERE token = '%s'", $newspam, $probability, time(), $token);
       }
     }
   }
