pkgsrc-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
pkg/47926: Perl 5.18.0 requieres modification of spamassassin 3.3.2
>Number: 47926
>Category: pkg
>Synopsis: Perl 5.18.0 requieres modification of spamassassin 3.3.2
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: pkg-manager
>State: open
>Class: change-request
>Submitter-Id: net
>Arrival-Date: Fri Jun 14 15:15:00 +0000 2013
>Originator: Uwe Klaus
>Release: NetBSD 6.1_STABLE
>Organization:
>Environment:
NetBSD hgb2 6.1_STABLE NetBSD 6.1_STABLE (GENERIC.hgb2) #1: Tue May 21 10:00:17
CEST 2013 root@hgb2:/usr/obj.i386/sys/arch/i386/compile/GENERIC.hgb2 i386
>Description:
spamassassin 3.3.2 and Perl 5.18.0: Altering hash requires restarting loop else
UNDEFINED behavior
for details see SA Bugzilla ? Bug 6937
https://issues.apache.org/SpamAssassin/show_bug.cgi?id=6937
>How-To-Repeat:
>Fix:
Add the following 6 patches
patch-lib_Mail_SpamAssassin_AsyncLoop.pm
--- lib/Mail/SpamAssassin/AsyncLoop.pm.orig 2011-06-06 23:59:17.000000000
+0000
+++ lib/Mail/SpamAssassin/AsyncLoop.pm
@@ -360,7 +360,14 @@ sub complete_lookups {
}
$now = time; # capture new timestamp, after possible sleep in 'select'
- while (my($key,$ent) = each %$pending) {
+ # A callback routine may generate another DNS query, which may insert
+ # an entry into the %$pending hash thus invalidating the each() context.
+ # So, make sure that callbacks are not called while the each() context
+ # is open, or avoid using each(). [Bug 6937]
+ #
+ # while (my($key,$ent) = each %$pending) {
+ foreach my $key (keys %$pending) {
+ my $ent = $pending->{$key};
my $id = $ent->{id};
if (defined $ent->{poll_callback}) { # call a "poll_callback" if exists
# be nice, provide fresh info to a callback routine
@@ -448,7 +455,8 @@ sub abort_remaining_lookups {
my $pending = $self->{pending_lookups};
my $foundcnt = 0;
my $now = time;
- while (my($key,$ent) = each %$pending) {
+ foreach my $key (keys %$pending) {
+ my $ent = $pending->{$key};
dbg("async: aborting after %.3f s, %s: %s",
$now - $ent->{start_time},
(defined $ent->{timeout_initial} &&
patch-lib_Mail_SpamAssassin_Conf_Parser.pm
--- lib/Mail/SpamAssassin/Conf/Parser.pm.orig 2013-06-14 14:47:39.000000000
+0000
+++ lib/Mail/SpamAssassin/Conf/Parser.pm
@@ -1248,7 +1248,7 @@ sub is_regexp_valid {
my $safere = $re;
my $mods = '';
local ($1,$2);
- if ($re =~ s/^m{//) {
+ if ($re =~ s/^m\{//) {
$re =~ s/}([a-z]*)$//; $mods = $1;
}
elsif ($re =~ s/^m\(//) {
patch-lib_Mail_SpamAssassin_DnsResolver.pm
--- lib/Mail/SpamAssassin/DnsResolver.pm.orig 2011-06-06 23:59:17.000000000
+0000
+++ lib/Mail/SpamAssassin/DnsResolver.pm
@@ -440,10 +440,16 @@ sub poll_responses {
{ my $timer; # collects timestamp when variable goes out of scope
if (!defined($timeout) || $timeout > 0)
{ $timer = $self->{main}->time_method("poll_dns_idle") }
+ $! = 0;
($nfound, $timeleft) = select($rout=$rin, undef, undef, $timeout);
}
if (!defined $nfound || $nfound < 0) {
- warn "dns: select failed: $!";
+ if ($!) { warn "dns: select failed: $!\n" }
+ else { info("dns: select interrupted") }
+ return;
+ } elsif (!$nfound) {
+ if (!defined $timeout) { warn("dns: select returned empty-handed\n") }
+ elsif ($timeout > 0) { dbg("dns: select timed out %.3f s", $timeout) }
return;
}
patch-lib_Mail_SpamAssassin_Message.pm
--- lib/Mail/SpamAssassin/Message.pm.orig 2011-06-06 23:59:17.000000000
+0000
+++ lib/Mail/SpamAssassin/Message.pm
@@ -566,7 +566,7 @@ sub finish {
while (my $part = shift @toclean) {
# bug 5557: windows requires tmp file be closed before it can be rm'd
if (ref $part->{'raw'} eq 'GLOB') {
- close($part->{'raw'}) or die "error closing input file: $!";
+ close($part->{'raw'}) or warn "error closing input file: $!";
}
# bug 5858: avoid memory leak with deep MIME structure
patch-lib_Mail_SpamAssassin_PerMsgStatus.pm
--- lib/Mail/SpamAssassin/PerMsgStatus.pm.orig 2011-06-06 23:59:17.000000000
+0000
+++ lib/Mail/SpamAssassin/PerMsgStatus.pm
@@ -420,8 +420,8 @@ sub _get_autolearn_points {
}
}
- # ignore tests with 0 score in this scoreset
- next if ($scores->{$test} == 0);
+ # ignore tests with 0 score (or undefined) in this scoreset
+ next if !$scores->{$test};
# Go ahead and add points to the proper locations
if (!$self->{conf}->maybe_header_only ($test)) {
@@ -1252,13 +1252,12 @@ sub _get_tag {
my $arg = (shift || ",");
my $line = '';
foreach my $test (sort @{$self->{test_names_hit}}) {
- if (!$line) {
- $line .= $test . "=" . $self->{conf}->{scores}->{$test};
- } else {
- $line .= $arg . $test . "=" .
$self->{conf}->{scores}->{$test};
- }
+ my $score = $self->{conf}->{scores}->{$test};
+ $score = '0' if !defined $score;
+ $line .= $arg if $line ne '';
+ $line .= $test . "=" . $score;
}
- $line ? $line : 'none';
+ $line ne '' ? $line : 'none';
},
PREVIEW => sub { $self->get_content_preview() },
patch-lib_Mail_SpamAssassin_Util.pm
--- lib/Mail/SpamAssassin/Util.pm.orig 2011-06-06 23:59:17.000000000 +0000
+++ lib/Mail/SpamAssassin/Util.pm
@@ -1582,7 +1582,7 @@ sub regexp_remove_delimiters {
warn "cannot remove delimiters from null regexp";
return undef; # invalid
}
- elsif ($re =~ s/^m{//) { # m{foo/bar}
+ elsif ($re =~ s/^m\{//) { # m{foo/bar}
$delim = '}';
}
elsif ($re =~ s/^m\(//) { # m(foo/bar)
Home |
Main Index |
Thread Index |
Old Index