svn commit: r1934996 - in spamassassin/trunk: lib/Mail/SpamAssassin/Plugin rules

[email protected] Fri, 05 Jun 2026 08:08:11 -0000
Newsgroups gmane.mail.spam.spamassassin.cvs
Message-ID <178064689185.3006145.9608756579886993713@svn03-he-fi>
Author: gbechis
Date: Fri Jun  5 08:08:11 2026
New Revision: 1934996

Log:
bare CR or LF are illegal; only \r\n followed by a space is valid folding

Modified:
   spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/HeaderEval.pm
   spamassassin/trunk/rules/20_head_tests.cf

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/HeaderEval.pm
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/HeaderEval.pm	Fri Jun  5 08:02:50 2026	(r1934995)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/HeaderEval.pm	Fri Jun  5 08:08:11 2026	(r1934996)
@@ -197,6 +197,10 @@ sub check_illegal_chars {
   # (non-ASCII + C0 controls except TAB, NL, CR)
   my $illegal = $str =~ tr/\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\xff//;
 
+  # bare CR or LF are illegal; only \r\n followed by a space is valid folding
+  (my $str_nofold = $str) =~ s/\r\n[ \t]//g;
+  $illegal += $str_nofold =~ tr/\x0a\x0d//;
+
   # minor exemptions for Subject
   if ($illegal > 0 && lc $header eq "subject:raw") {
     # only exempt a single cent sign, pound sign, or registered sign

Modified: spamassassin/trunk/rules/20_head_tests.cf
==============================================================================
--- spamassassin/trunk/rules/20_head_tests.cf	Fri Jun  5 08:02:50 2026	(r1934995)
+++ spamassassin/trunk/rules/20_head_tests.cf	Fri Jun  5 08:08:11 2026	(r1934996)
@@ -466,8 +466,9 @@ if (version >= 4.000000)
   header __SUBJ_ILLEGAL_CHARS	eval:check_illegal_chars('Subject','0.00','2')
   meta SUBJ_ILLEGAL_CHARS         (__SUBJ_ILLEGAL_CHARS && !__FROM_YAHOO_COM)
   header FROM_ILLEGAL_CHARS	eval:check_illegal_chars('From','0.20','2')
+  header REPLYTO_ILLEGAL_CHARS	eval:check_illegal_chars('Reply-To','0.020','2')
   header __HEAD_ILLEGAL_CHARS	eval:check_illegal_chars('ALL','0.010','2')
-  meta HEAD_ILLEGAL_CHARS	__HEAD_ILLEGAL_CHARS && !__SUBJ_ILLEGAL_CHARS && !FROM_ILLEGAL_CHARS
+  meta HEAD_ILLEGAL_CHARS	__HEAD_ILLEGAL_CHARS && !__SUBJ_ILLEGAL_CHARS && !FROM_ILLEGAL_CHARS && !REPLYTO_ILLEGAL_CHARS
 endif
 if (version < 4.000000)
   meta __SUBJ_ILLEGAL_CHARS 0