Wed, 08 Feb 2012 20:07:00 +0200
Update version, adapt patch, correct PID writing, correct build on newer
FreeBSD releases, and most importantly introduce new patch to try to
avoid segfault caused by multiple network interfaces with the same (or
no) address. This is common when configuring bridges and tunnels.
michael@374 | 1 | Index: lib/Mail/SpamAssassin/Dns.pm |
michael@374 | 2 | --- lib/Mail/SpamAssassin/Dns.pm.orig 2010-03-16 15:49:21.000000000 +0100 |
michael@374 | 3 | +++ lib/Mail/SpamAssassin/Dns.pm 2011-02-08 16:03:06.000000000 +0100 |
michael@374 | 4 | @@ -754,7 +754,7 @@ |
michael@374 | 5 | dbg("dns: entering helper-app run mode"); |
michael@374 | 6 | $self->{old_slash} = $/; # Razor pollutes this |
michael@374 | 7 | %{$self->{old_env}} = (); |
michael@374 | 8 | - if ( defined %ENV ) { |
michael@374 | 9 | + if (%ENV) { |
michael@374 | 10 | # undefined values in %ENV can result due to autovivification elsewhere, |
michael@374 | 11 | # this prevents later possible warnings when we restore %ENV |
michael@374 | 12 | while (my ($key, $value) = each %ENV) { |
michael@374 | 13 | Index: lib/Mail/SpamAssassin/HTML.pm |
michael@374 | 14 | --- lib/Mail/SpamAssassin/HTML.pm.orig 2010-03-16 15:49:21.000000000 +0100 |
michael@374 | 15 | +++ lib/Mail/SpamAssassin/HTML.pm 2011-02-08 16:03:06.000000000 +0100 |
michael@374 | 16 | @@ -191,7 +191,7 @@ |
michael@374 | 17 | my $self = shift; |
michael@374 | 18 | my %options = @_; |
michael@374 | 19 | |
michael@374 | 20 | - return join('', @{ $self->{text} }) unless keys %options; |
michael@374 | 21 | + return join('', @{ $self->{text} }) unless %options; |
michael@374 | 22 | |
michael@374 | 23 | my $mask; |
michael@374 | 24 | while (my ($k, $v) = each %options) { |
michael@374 | 25 | Index: lib/Mail/SpamAssassin/Plugin/AntiVirus.pm |
michael@374 | 26 | --- lib/Mail/SpamAssassin/Plugin/AntiVirus.pm.orig 2010-03-16 15:49:21.000000000 +0100 |
michael@374 | 27 | +++ lib/Mail/SpamAssassin/Plugin/AntiVirus.pm 2011-02-08 16:04:30.000000000 +0100 |
michael@374 | 28 | @@ -98,9 +98,9 @@ |
michael@374 | 29 | my ($ctype, $boundary, $charset, $name) = |
michael@374 | 30 | Mail::SpamAssassin::Util::parse_content_type($p->get_header('content-type')); |
michael@374 | 31 | |
michael@374 | 32 | - $name = lc $name || ''; |
michael@374 | 33 | + $name = lc($name || ''); |
michael@374 | 34 | |
michael@374 | 35 | - my $cte = lc $p->get_header('content-transfer-encoding') || ''; |
michael@374 | 36 | + my $cte = lc($p->get_header('content-transfer-encoding') || ''); |
michael@374 | 37 | $ctype = lc $ctype; |
michael@374 | 38 | |
michael@374 | 39 | if ($name && $name =~ /\.(?:ade|adp|asx|bas|bat|chm|cmd|com|cpl|crt|dll|exe|hlp|hta|inf|ins|isp|js|jse|lnk|mda|mdb|mde|mdt|mdw|mdz|msc|msi|msp|mst|nws|ops|pcd|pif|prf|reg|scf|scr\??|sct|shb|shs|shm|swf|url|vb|vbe|vbs|vbx|vxd|wsc|wsf|wsh)$/) |
michael@374 | 40 | Index: lib/Mail/SpamAssassin/Plugin/BodyEval.pm |
michael@374 | 41 | --- lib/Mail/SpamAssassin/Plugin/BodyEval.pm.orig 2010-03-16 15:49:21.000000000 +0100 |
michael@374 | 42 | +++ lib/Mail/SpamAssassin/Plugin/BodyEval.pm 2011-02-08 16:03:06.000000000 +0100 |
michael@374 | 43 | @@ -119,7 +119,7 @@ |
michael@374 | 44 | } |
michael@374 | 45 | |
michael@374 | 46 | # If there are no words, mark if there's at least 1 image ... |
michael@374 | 47 | - if (keys %html == 0 && exists $pms->{html}{inside}{img}) { |
michael@374 | 48 | + if (!%html && exists $pms->{html}{inside}{img}) { |
michael@374 | 49 | # Use "\n" as the mark since it can't ever occur normally |
michael@374 | 50 | $html{"\n"}=1; |
michael@374 | 51 | } |
michael@374 | 52 | Index: lib/Mail/SpamAssassin/Plugin/Check.pm |
michael@374 | 53 | --- lib/Mail/SpamAssassin/Plugin/Check.pm.orig 2010-03-16 15:49:21.000000000 +0100 |
michael@374 | 54 | +++ lib/Mail/SpamAssassin/Plugin/Check.pm 2011-02-08 16:03:06.000000000 +0100 |
michael@374 | 55 | @@ -307,64 +307,51 @@ |
michael@374 | 56 | my $package_name = __PACKAGE__; |
michael@374 | 57 | my $methodname = $package_name."::_".$ruletype."_tests_".$clean_priority; |
michael@374 | 58 | |
michael@374 | 59 | - if (defined &{$methodname} && !$doing_user_rules) { |
michael@374 | 60 | -run_compiled_method: |
michael@374 | 61 | - # dbg("rules: run_generic_tests - calling %s", $methodname); |
michael@374 | 62 | - my $t = Mail::SpamAssassin::Timeout->new({ deadline => $master_deadline }); |
michael@374 | 63 | - my $err = $t->run(sub { |
michael@374 | 64 | - no strict "refs"; |
michael@374 | 65 | - $methodname->($pms, @{$opts{args}}); |
michael@374 | 66 | - }); |
michael@374 | 67 | - if ($t->timed_out() && $master_deadline && time > $master_deadline) { |
michael@374 | 68 | - info("check: exceeded time limit in $methodname, skipping further tests"); |
michael@374 | 69 | - $pms->{deadline_exceeded} = 1; |
michael@374 | 70 | - } |
michael@374 | 71 | - return; |
michael@374 | 72 | - } |
michael@374 | 73 | + if (!defined &{$methodname} || $doing_user_rules) { |
michael@374 | 74 | |
michael@374 | 75 | - # use %nopts for named parameter-passing; it's more friendly to future-proof |
michael@374 | 76 | - # subclassing, since new parameters can be added without breaking third-party |
michael@374 | 77 | - # subclassed implementations of this plugin. |
michael@374 | 78 | - my %nopts = ( |
michael@374 | 79 | - ruletype => $ruletype, |
michael@374 | 80 | - doing_user_rules => $doing_user_rules, |
michael@374 | 81 | - priority => $priority, |
michael@374 | 82 | - clean_priority => $clean_priority |
michael@374 | 83 | - ); |
michael@374 | 84 | - |
michael@374 | 85 | - # build up the eval string... |
michael@374 | 86 | - $self->{evalstr_methodname} = $methodname; |
michael@374 | 87 | - $self->{evalstr_chunk_current_methodname} = undef; |
michael@374 | 88 | - $self->{evalstr_chunk_methodnames} = []; |
michael@374 | 89 | - $self->{evalstr_chunk_prefix} = []; # stack (array) of source code sections |
michael@374 | 90 | - $self->{evalstr} = ''; $self->{evalstr_l} = 0; |
michael@374 | 91 | - $self->{evalstr2} = ''; |
michael@374 | 92 | - $self->begin_evalstr_chunk($pms); |
michael@374 | 93 | - |
michael@374 | 94 | - $self->push_evalstr_prefix($pms, ' |
michael@374 | 95 | - # start_rules_plugin_code '.$ruletype.' '.$priority.' |
michael@374 | 96 | - my $scoresptr = $self->{conf}->{scores}; |
michael@374 | 97 | - '); |
michael@374 | 98 | - if (defined $opts{pre_loop_body}) { |
michael@374 | 99 | - $opts{pre_loop_body}->($self, $pms, $conf, %nopts); |
michael@374 | 100 | - } |
michael@374 | 101 | - $self->add_evalstr($pms, |
michael@374 | 102 | - $self->start_rules_plugin_code($ruletype, $priority) ); |
michael@374 | 103 | - while (my($rulename, $test) = each %{$opts{testhash}->{$priority}}) { |
michael@374 | 104 | - $opts{loop_body}->($self, $pms, $conf, $rulename, $test, %nopts); |
michael@374 | 105 | - } |
michael@374 | 106 | - if (defined $opts{post_loop_body}) { |
michael@374 | 107 | - $opts{post_loop_body}->($self, $pms, $conf, %nopts); |
michael@374 | 108 | - } |
michael@374 | 109 | + # use %nopts for named parameter-passing; it's more friendly |
michael@374 | 110 | + # to future-proof subclassing, since new parameters can be added without |
michael@374 | 111 | + # breaking third-party subclassed implementations of this plugin. |
michael@374 | 112 | + my %nopts = ( |
michael@374 | 113 | + ruletype => $ruletype, |
michael@374 | 114 | + doing_user_rules => $doing_user_rules, |
michael@374 | 115 | + priority => $priority, |
michael@374 | 116 | + clean_priority => $clean_priority |
michael@374 | 117 | + ); |
michael@374 | 118 | + |
michael@374 | 119 | + # build up the eval string... |
michael@374 | 120 | + $self->{evalstr_methodname} = $methodname; |
michael@374 | 121 | + $self->{evalstr_chunk_current_methodname} = undef; |
michael@374 | 122 | + $self->{evalstr_chunk_methodnames} = []; |
michael@374 | 123 | + $self->{evalstr_chunk_prefix} = []; # stack (array) of source code sections |
michael@374 | 124 | + $self->{evalstr} = ''; $self->{evalstr_l} = 0; |
michael@374 | 125 | + $self->{evalstr2} = ''; |
michael@374 | 126 | + $self->begin_evalstr_chunk($pms); |
michael@374 | 127 | + |
michael@374 | 128 | + $self->push_evalstr_prefix($pms, ' |
michael@374 | 129 | + # start_rules_plugin_code '.$ruletype.' '.$priority.' |
michael@374 | 130 | + my $scoresptr = $self->{conf}->{scores}; |
michael@374 | 131 | + '); |
michael@374 | 132 | + if (defined $opts{pre_loop_body}) { |
michael@374 | 133 | + $opts{pre_loop_body}->($self, $pms, $conf, %nopts); |
michael@374 | 134 | + } |
michael@374 | 135 | + $self->add_evalstr($pms, |
michael@374 | 136 | + $self->start_rules_plugin_code($ruletype, $priority) ); |
michael@374 | 137 | + while (my($rulename, $test) = each %{$opts{testhash}->{$priority}}) { |
michael@374 | 138 | + $opts{loop_body}->($self, $pms, $conf, $rulename, $test, %nopts); |
michael@374 | 139 | + } |
michael@374 | 140 | + if (defined $opts{post_loop_body}) { |
michael@374 | 141 | + $opts{post_loop_body}->($self, $pms, $conf, %nopts); |
michael@374 | 142 | + } |
michael@374 | 143 | |
michael@374 | 144 | - $self->flush_evalstr($pms, 'run_generic_tests'); |
michael@374 | 145 | - $self->free_ruleset_source($pms, $ruletype, $priority); |
michael@374 | 146 | + $self->flush_evalstr($pms, 'run_generic_tests'); |
michael@374 | 147 | + $self->free_ruleset_source($pms, $ruletype, $priority); |
michael@374 | 148 | |
michael@374 | 149 | - # clear out a previous version of this method |
michael@374 | 150 | - undef &{$methodname}; |
michael@374 | 151 | + # clear out a previous version of this method |
michael@374 | 152 | + undef &{$methodname}; |
michael@374 | 153 | |
michael@374 | 154 | - # generate the loop that goes through each line... |
michael@374 | 155 | - my $evalstr = <<"EOT"; |
michael@374 | 156 | + # generate the loop that goes through each line... |
michael@374 | 157 | + my $evalstr = <<"EOT"; |
michael@374 | 158 | { |
michael@374 | 159 | package $package_name; |
michael@374 | 160 | |
michael@374 | 161 | @@ -373,40 +360,51 @@ |
michael@374 | 162 | sub $methodname { |
michael@374 | 163 | EOT |
michael@374 | 164 | |
michael@374 | 165 | - for my $chunk_methodname (@{$self->{evalstr_chunk_methodnames}}) { |
michael@374 | 166 | - $evalstr .= " $chunk_methodname(\@_);\n"; |
michael@374 | 167 | - } |
michael@374 | 168 | + for my $chunk_methodname (@{$self->{evalstr_chunk_methodnames}}) { |
michael@374 | 169 | + $evalstr .= " $chunk_methodname(\@_);\n"; |
michael@374 | 170 | + } |
michael@374 | 171 | |
michael@374 | 172 | - $evalstr .= <<"EOT"; |
michael@374 | 173 | + $evalstr .= <<"EOT"; |
michael@374 | 174 | } |
michael@374 | 175 | |
michael@374 | 176 | 1; |
michael@374 | 177 | } |
michael@374 | 178 | EOT |
michael@374 | 179 | |
michael@374 | 180 | - delete $self->{evalstr}; # free up some RAM before we eval() |
michael@374 | 181 | - delete $self->{evalstr2}; |
michael@374 | 182 | - delete $self->{evalstr_methodname}; |
michael@374 | 183 | - delete $self->{evalstr_chunk_current_methodname}; |
michael@374 | 184 | - delete $self->{evalstr_chunk_methodnames}; |
michael@374 | 185 | - delete $self->{evalstr_chunk_prefix}; |
michael@374 | 186 | - |
michael@374 | 187 | - dbg("rules: run_generic_tests - compiling eval code: %s, priority %s", |
michael@374 | 188 | - $ruletype, $priority); |
michael@374 | 189 | -# dbg("rules: eval code to compile: $evalstr"); |
michael@374 | 190 | - my $eval_result; |
michael@374 | 191 | - { my $timer = $self->{main}->time_method('compile_gen'); |
michael@374 | 192 | - $eval_result = eval($evalstr); |
michael@374 | 193 | - } |
michael@374 | 194 | - if (!$eval_result) { |
michael@374 | 195 | - my $eval_stat = $@ ne '' ? $@ : "errno=$!"; chomp $eval_stat; |
michael@374 | 196 | - warn "rules: failed to compile $ruletype tests, skipping:\n". |
michael@374 | 197 | - "\t($eval_stat)\n"; |
michael@374 | 198 | - $pms->{rule_errors}++; |
michael@374 | 199 | - } |
michael@374 | 200 | - else { |
michael@374 | 201 | + delete $self->{evalstr}; # free up some RAM before we eval() |
michael@374 | 202 | + delete $self->{evalstr2}; |
michael@374 | 203 | + delete $self->{evalstr_methodname}; |
michael@374 | 204 | + delete $self->{evalstr_chunk_current_methodname}; |
michael@374 | 205 | + delete $self->{evalstr_chunk_methodnames}; |
michael@374 | 206 | + delete $self->{evalstr_chunk_prefix}; |
michael@374 | 207 | + |
michael@374 | 208 | + dbg("rules: run_generic_tests - compiling eval code: %s, priority %s", |
michael@374 | 209 | + $ruletype, $priority); |
michael@374 | 210 | + # dbg("rules: eval code to compile: $evalstr"); |
michael@374 | 211 | + my $eval_result; |
michael@374 | 212 | + { my $timer = $self->{main}->time_method('compile_gen'); |
michael@374 | 213 | + $eval_result = eval($evalstr); |
michael@374 | 214 | + } |
michael@374 | 215 | + if (!$eval_result) { |
michael@374 | 216 | + my $eval_stat = $@ ne '' ? $@ : "errno=$!"; chomp $eval_stat; |
michael@374 | 217 | + warn "rules: failed to compile $ruletype tests, skipping:\n". |
michael@374 | 218 | + "\t($eval_stat)\n"; |
michael@374 | 219 | + $pms->{rule_errors}++; |
michael@374 | 220 | + return; |
michael@374 | 221 | + } |
michael@374 | 222 | dbg("rules: compiled $ruletype tests"); |
michael@374 | 223 | - goto run_compiled_method; |
michael@374 | 224 | + } |
michael@374 | 225 | + |
michael@374 | 226 | +#run_compiled_method: |
michael@374 | 227 | +# dbg("rules: run_generic_tests - calling %s", $methodname); |
michael@374 | 228 | + my $t = Mail::SpamAssassin::Timeout->new({ deadline => $master_deadline }); |
michael@374 | 229 | + my $err = $t->run(sub { |
michael@374 | 230 | + no strict "refs"; |
michael@374 | 231 | + $methodname->($pms, @{$opts{args}}); |
michael@374 | 232 | + }); |
michael@374 | 233 | + if ($t->timed_out() && $master_deadline && time > $master_deadline) { |
michael@374 | 234 | + info("check: exceeded time limit in $methodname, skipping further tests"); |
michael@374 | 235 | + $pms->{deadline_exceeded} = 1; |
michael@374 | 236 | } |
michael@374 | 237 | } |
michael@374 | 238 | |
michael@374 | 239 | Index: lib/Mail/SpamAssassin/Plugin/MIMEEval.pm |
michael@374 | 240 | --- lib/Mail/SpamAssassin/Plugin/MIMEEval.pm.orig 2010-03-16 15:49:21.000000000 +0100 |
michael@374 | 241 | +++ lib/Mail/SpamAssassin/Plugin/MIMEEval.pm 2011-02-08 16:03:32.000000000 +0100 |
michael@374 | 242 | @@ -498,7 +498,7 @@ |
michael@374 | 243 | # perhaps just limit to test, and image? |
michael@374 | 244 | next if ($ctype eq 'application/ics'); |
michael@374 | 245 | |
michael@374 | 246 | - my $cte = lc $p->get_header('content-transfer-encoding') || ''; |
michael@374 | 247 | + my $cte = lc($p->get_header('content-transfer-encoding') || ''); |
michael@374 | 248 | next if ($cte !~ /^base64$/); |
michael@374 | 249 | foreach my $l ( @{$p->raw()} ) { |
michael@374 | 250 | my $len = length $l; |