Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 Jun 2011 19:27:07 GMT
From:      Michael Scheidell <scheidell@secnap.net>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   ports/158267: [Maintainer-Update] ports/p5-Mail-SpamAssassin
Message-ID:  <201106241927.p5OJR7u8072377@red.freebsd.org>
Resent-Message-ID: <201106241930.p5OJUHEP050680@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         158267
>Category:       ports
>Synopsis:       [Maintainer-Update] ports/p5-Mail-SpamAssassin
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          maintainer-update
>Submitter-Id:   current-users
>Arrival-Date:   Fri Jun 24 19:30:16 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     Michael Scheidell
>Release:        lots of them
>Organization:
SECNAP Network Security
>Environment:
na.  supports all current versions of freebsd, as of the date of this port. might support old ones also, but don't email me if it doesn't.
>Description:
Update SA 3.3.1 to current version 3.3.2.
remove these files, fixed in 3.3.2 trunk:
files/patch-DKIM.pm,
files/patch-bug6392
files/patch-bug6396
files/patch-bug6488

replaces pr  157982, thanks to Chris Rees
(don't use absolute path's, use stopdaemin, and not ../spamd.(sh) stop)
(committers: please close pr 157982)

ADDED FILE:
files/patch-bug6624
CRITICAL BUG FIX, was in 3.3.2 also:
new versions of mysql broke bayes store (sometimes)

<https://issues.apache.org/SpamAssassin/show_bug.cgi?id=6624>;


Minor bug fix:  pkg-install was not asking for sa-update because rc from lint changed.

Minor bug, continuation of pr 157584, USERS/GROUPS hardwired. make a couple changes to Makefile and pkg-install do make this follow ${USERS} and not 'spamd'

fat fingers:  open a pr if this breaks something please

changed Makefile: build_depends != run_depends (it does, its duplicated, but the side affect of having build_depends = run_depends in Makefile, is that binary packages have more dependencies then they should. 


>How-To-Repeat:
na
>Fix:
apply attached patch, run sa-update (optionally sa-compile) restart spamd/amavisd, whatever is running your SpamAssassin

Patch attached with submission follows:

diff -bBru /var/tmp/sa331/Makefile ./Makefile
--- /var/tmp/sa331/Makefile	2011-06-07 19:23:51.000000000 -0400
+++ ./Makefile	2011-06-24 15:20:26.000000000 -0400
@@ -6,8 +6,7 @@
 #
 
 PORTNAME=	Mail-SpamAssassin
-PORTVERSION=	3.3.1
-PORTREVISION=	4
+PORTVERSION=	3.3.2
 CATEGORIES=	mail perl5
 MASTER_SITES=	${MASTER_SITE_APACHE:S/$/:apache/} ${MASTER_SITE_PERL_CPAN:S/$/:cpan/}
 MASTER_SITE_SUBDIR=	spamassassin/source/:apache Mail/:cpan
@@ -23,7 +22,12 @@
 		${SITE_PERL}/Bundle/LWP.pm:${PORTSDIR}/www/p5-libwww \
 		${SITE_PERL}/${PERL_ARCH}/Encode/Detect.pm:${PORTSDIR}/converters/p5-Encode-Detect \
 		${SITE_PERL}/Mail/Internet.pm:${PORTSDIR}/mail/p5-Mail-Tools
-BUILD_DEPENDS=	${RUN_DEPENDS}
+BUILD_DEPENDS=	p5-NetAddr-IP>=4.00.7:${PORTSDIR}/net-mgmt/p5-NetAddr-IP \
+		p5-Net-DNS>=0.63:${PORTSDIR}/dns/p5-Net-DNS \
+		p5-HTML-Parser>=3.43:${PORTSDIR}/www/p5-HTML-Parser \
+		${SITE_PERL}/Bundle/LWP.pm:${PORTSDIR}/www/p5-libwww \
+		${SITE_PERL}/${PERL_ARCH}/Encode/Detect.pm:${PORTSDIR}/converters/p5-Encode-Detect \
+		${SITE_PERL}/Mail/Internet.pm:${PORTSDIR}/mail/p5-Mail-Tools
 
 CONFLICTS=	ja-p5-Mail-SpamAssassin-[0-9]*
 
@@ -224,7 +228,7 @@
 SUB_LIST+=	SQL_FLAG=""
 .endif
 .if !defined(WITH_AS_ROOT)
-SUB_LIST+=	RUN_AS_USER="-u spamd -H /var/spool/spamd"
+SUB_LIST+=	RUN_AS_USER="-u ${USERS} -H /var/spool/spamd"
 .else
 SUB_LIST+=	RUN_AS_USER=""
 .endif
@@ -274,7 +278,7 @@
 .endif
 
 pre-su-install:
-	@${SH} ${PKGINSTALL} ${PKGNAME} PRE-INSTALL
+	@${SH} USER=${USERS} GROUP=${GROUPS} ${PKGINSTALL} ${PKGNAME} PRE-INSTALL
 	@${INSTALL_PROGRAM} ${WRKSRC}/spamc/libspamc.so ${PREFIX}/lib/libspamc.so.0
 	@${LN} -sf libspamc.so.0 ${PREFIX}/lib/libspamc.so
 .if !defined(WITHOUT_SSL)
@@ -299,7 +303,7 @@
 	@[ -f ${PREFIX}/etc/mail/spamassassin/v320.pre ] || \
 		${CP} ${PREFIX}/etc/mail/spamassassin/v320.pre.sample \
 			${PREFIX}/etc/mail/spamassassin/v320.pre
-	@PKG_PREFIX=${PREFIX} BATCH=${BATCH} SU_CMD="${SU_CMD}" ${SH} ${PKGDIR}/pkg-install ${PKGNAME} POST-INSTALL
+	@PKG_PREFIX=${PREFIX} BATCH=${BATCH} SU_CMD="${SU_CMD}" USER=${USERS} GROUP=${GROUPS} ${SH} ${PKGDIR}/pkg-install ${PKGNAME} POST-INSTALL
 	@[ -f ${PREFIX}/etc/mail/spamassassin/v330.pre ] || \
 		${CP} ${PREFIX}/etc/mail/spamassassin/v330.pre.sample \
 			${PREFIX}/etc/mail/spamassassin/v330.pre
diff -bBru /var/tmp/sa331/distinfo ./distinfo
--- /var/tmp/sa331/distinfo	2011-06-07 19:23:51.000000000 -0400
+++ ./distinfo	2011-06-24 06:42:10.000000000 -0400
@@ -1,2 +1,2 @@
-SHA256 (Mail-SpamAssassin-3.3.1.tar.gz) = a11ca187150d5a8fc2904c4a50f29d3ff739294fa714aaab127ba692d65410ad
-SIZE (Mail-SpamAssassin-3.3.1.tar.gz) = 1196842
+SHA256 (Mail-SpamAssassin-3.3.2.tar.gz) = 5323038939a0ef9fc97d5264defce3ae1d95e98b3a94c4c3b583341c927f32df
+SIZE (Mail-SpamAssassin-3.3.2.tar.gz) = 1208182
diff -bBru /var/tmp/sa331/files/patch-DKIM.pm ./files/patch-DKIM.pm
--- /var/tmp/sa331/files/patch-DKIM.pm	2010-04-08 09:13:01.000000000 -0400
+++ ./files/patch-DKIM.pm	2011-06-24 06:38:31.000000000 -0400
@@ -1,66 +0,0 @@
---- lib/Mail/SpamAssassin/Plugin/DKIM.pm	(revision 925052)
-+++ lib/Mail/SpamAssassin/Plugin/DKIM.pm	(working copy)
-@@ -213,6 +213,19 @@
- in the SpamAssassin distribution.  The whitelist score is lower, because
- these are often targets for abuse of public mailers which sign their mail.
- 
-+=item unwhitelist_from_dkim author@example.com
-+
-+Removes an email address from def_whitelist_from_dkim and whitelist_from_dkim
-+tables, if it exists. Useful for removing undesired default entries from a
-+distributed configuration file by a local.cf file or by a C<user_prefs>.
-+Note that a parameter is a single email address - currently that address
-+is removed regardless of a signing-domain which may have been specified in a
-+whitelisting entry.
-+
-+The specified email address has to match exactly the address previously
-+used in a whitelist_from_dkim or def_whitelist_from_dkim directive
-+(with an exception that its domain name part is matched case-insensitively).
-+
- =item adsp_override domain [signing-practices]
- 
- Currently few domains publish their signing practices (RFC 5617 - ADSP),
-@@ -362,6 +375,7 @@
-       }
-       my $address = $1;
-       my $sdid = defined $2 ? $2 : '';  # empty implies author domain signature
-+      $address =~ s/(\@[^@]*)\z/lc($1)/e; # lowercase the email address domain
-       $self->{parser}->add_to_addrlist_rcvd('whitelist_from_dkim',
-                                             $address, $sdid);
-     }
-@@ -381,12 +395,32 @@
-       }
-       my $address = $1;
-       my $sdid = defined $2 ? $2 : '';  # empty implies author domain signature
-+      $address =~ s/(\@[^@]*)\z/lc($1)/e; # lowercase the email address domain
-       $self->{parser}->add_to_addrlist_rcvd('def_whitelist_from_dkim',
-                                             $address, $sdid);
-     }
-   });
- 
-   push (@cmds, {
-+    setting => 'unwhitelist_from_dkim',
-+    type => $Mail::SpamAssassin::Conf::CONF_TYPE_ADDRLIST,
-+    code => sub {
-+      my ($self, $key, $value, $line) = @_;
-+      unless (defined $value && $value !~ /^$/) {
-+        return $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE;
-+      }
-+      unless ($value =~ /^\S+$/) {
-+        return $Mail::SpamAssassin::Conf::INVALID_VALUE;
-+      }
-+      $value =~ s/(\@[^@]*)\z/lc($1)/e;  # lowercase the email address domain
-+      $self->{parser}->remove_from_addrlist_rcvd('whitelist_from_dkim',
-+                                                 $value);
-+      $self->{parser}->remove_from_addrlist_rcvd('def_whitelist_from_dkim',
-+                                                 $value);
-+    }
-+  });
-+
-+  push (@cmds, {
-     setting => 'adsp_override',
-     type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
-     code => sub {
-
-
-
diff -bBru /var/tmp/sa331/files/patch-bug6392 ./files/patch-bug6392
--- /var/tmp/sa331/files/patch-bug6392	2010-10-06 06:38:09.000000000 -0400
+++ ./files/patch-bug6392	2011-06-24 06:38:23.000000000 -0400
@@ -1,225 +0,0 @@
-Index: lib/Mail/SpamAssassin/HTML.pm
-===================================================================
---- lib/Mail/SpamAssassin/HTML.pm	(revision 943932)
-+++ lib/Mail/SpamAssassin/HTML.pm	(revision 943933)
-@@ -191,7 +191,7 @@
-   my $self = shift;
-   my %options = @_;
- 
--  return join('', @{ $self->{text} }) unless keys %options;
-+  return join('', @{ $self->{text} }) unless %options;
- 
-   my $mask;
-   while (my ($k, $v) = each %options) {
-Index: lib/Mail/SpamAssassin/Dns.pm
-===================================================================
---- lib/Mail/SpamAssassin/Dns.pm	(revision 943932)
-+++ lib/Mail/SpamAssassin/Dns.pm	(revision 943933)
-@@ -754,7 +754,7 @@
-   dbg("dns: entering helper-app run mode");
-   $self->{old_slash} = $/;              # Razor pollutes this
-   %{$self->{old_env}} = ();
--  if ( defined %ENV ) {
-+  if ( %ENV ) {
-     # undefined values in %ENV can result due to autovivification elsewhere,
-     # this prevents later possible warnings when we restore %ENV
-     while (my ($key, $value) = each %ENV) {
-Index: lib/Mail/SpamAssassin/Plugin/Check.pm
-===================================================================
---- lib/Mail/SpamAssassin/Plugin/Check.pm	(revision 943932)
-+++ lib/Mail/SpamAssassin/Plugin/Check.pm	(revision 943933)
-@@ -307,64 +307,51 @@
-   my $package_name = __PACKAGE__;
-   my $methodname = $package_name."::_".$ruletype."_tests_".$clean_priority;
- 
--  if (defined &{$methodname} && !$doing_user_rules) {
--run_compiled_method:
--  # dbg("rules: run_generic_tests - calling %s", $methodname);
--    my $t = Mail::SpamAssassin::Timeout->new({ deadline => $master_deadline });
--    my $err = $t->run(sub {
--      no strict "refs";
--      $methodname->($pms, @{$opts{args}});
--    });
--    if ($t->timed_out() && $master_deadline && time > $master_deadline) {
--      info("check: exceeded time limit in $methodname, skipping further tests");
--      $pms->{deadline_exceeded} = 1;
--    }
--    return;
--  }
-+  if (!defined &{$methodname} || $doing_user_rules) {
- 
--  # use %nopts for named parameter-passing; it's more friendly to future-proof
--  # subclassing, since new parameters can be added without breaking third-party
--  # subclassed implementations of this plugin.
--  my %nopts = (
--    ruletype => $ruletype,
--    doing_user_rules => $doing_user_rules,
--    priority => $priority,
--    clean_priority => $clean_priority
--  );
-+    # use %nopts for named parameter-passing; it's more friendly
-+    # to future-proof subclassing, since new parameters can be added without
-+    # breaking third-party subclassed implementations of this plugin.
-+    my %nopts = (
-+      ruletype => $ruletype,
-+      doing_user_rules => $doing_user_rules,
-+      priority => $priority,
-+      clean_priority => $clean_priority
-+    );
- 
--  # build up the eval string...
--  $self->{evalstr_methodname} = $methodname;
--  $self->{evalstr_chunk_current_methodname} = undef;
--  $self->{evalstr_chunk_methodnames} = [];
--  $self->{evalstr_chunk_prefix} = [];  # stack (array) of source code sections
--  $self->{evalstr} = ''; $self->{evalstr_l} = 0;
--  $self->{evalstr2} = '';
--  $self->begin_evalstr_chunk($pms);
-+    # build up the eval string...
-+    $self->{evalstr_methodname} = $methodname;
-+    $self->{evalstr_chunk_current_methodname} = undef;
-+    $self->{evalstr_chunk_methodnames} = [];
-+    $self->{evalstr_chunk_prefix} = []; # stack (array) of source code sections
-+    $self->{evalstr} = ''; $self->{evalstr_l} = 0;
-+    $self->{evalstr2} = '';
-+    $self->begin_evalstr_chunk($pms);
- 
--  $self->push_evalstr_prefix($pms, '
--      # start_rules_plugin_code '.$ruletype.' '.$priority.'
--      my $scoresptr = $self->{conf}->{scores};
--  ');
--  if (defined $opts{pre_loop_body}) {
--    $opts{pre_loop_body}->($self, $pms, $conf, %nopts);
--  }
--  $self->add_evalstr($pms,
--                     $self->start_rules_plugin_code($ruletype, $priority) );
--  while (my($rulename, $test) = each %{$opts{testhash}->{$priority}}) {
--    $opts{loop_body}->($self, $pms, $conf, $rulename, $test, %nopts);
--  }
--  if (defined $opts{post_loop_body}) {
--    $opts{post_loop_body}->($self, $pms, $conf, %nopts);
--  }
-+    $self->push_evalstr_prefix($pms, '
-+        # start_rules_plugin_code '.$ruletype.' '.$priority.'
-+        my $scoresptr = $self->{conf}->{scores};
-+    ');
-+    if (defined $opts{pre_loop_body}) {
-+      $opts{pre_loop_body}->($self, $pms, $conf, %nopts);
-+    }
-+    $self->add_evalstr($pms,
-+                       $self->start_rules_plugin_code($ruletype, $priority) );
-+    while (my($rulename, $test) = each %{$opts{testhash}->{$priority}}) {
-+      $opts{loop_body}->($self, $pms, $conf, $rulename, $test, %nopts);
-+    }
-+    if (defined $opts{post_loop_body}) {
-+      $opts{post_loop_body}->($self, $pms, $conf, %nopts);
-+    }
- 
--  $self->flush_evalstr($pms, 'run_generic_tests');
--  $self->free_ruleset_source($pms, $ruletype, $priority);
-+    $self->flush_evalstr($pms, 'run_generic_tests');
-+    $self->free_ruleset_source($pms, $ruletype, $priority);
- 
--  # clear out a previous version of this method
--  undef &{$methodname};
-+    # clear out a previous version of this method
-+    undef &{$methodname};
- 
--  # generate the loop that goes through each line...
--  my $evalstr = <<"EOT";
-+    # generate the loop that goes through each line...
-+    my $evalstr = <<"EOT";
-   {
-     package $package_name;
- 
-@@ -373,41 +360,52 @@
-     sub $methodname {
- EOT
- 
--  for my $chunk_methodname (@{$self->{evalstr_chunk_methodnames}}) {
--    $evalstr .= "      $chunk_methodname(\@_);\n";
--  }
-+    for my $chunk_methodname (@{$self->{evalstr_chunk_methodnames}}) {
-+      $evalstr .= "      $chunk_methodname(\@_);\n";
-+    }
- 
--  $evalstr .= <<"EOT";
-+    $evalstr .= <<"EOT";
-     }
- 
-     1;
-   }
- EOT
- 
--  delete $self->{evalstr};   # free up some RAM before we eval()
--  delete $self->{evalstr2};
--  delete $self->{evalstr_methodname};
--  delete $self->{evalstr_chunk_current_methodname};
--  delete $self->{evalstr_chunk_methodnames};
--  delete $self->{evalstr_chunk_prefix};
-+    delete $self->{evalstr};   # free up some RAM before we eval()
-+    delete $self->{evalstr2};
-+    delete $self->{evalstr_methodname};
-+    delete $self->{evalstr_chunk_current_methodname};
-+    delete $self->{evalstr_chunk_methodnames};
-+    delete $self->{evalstr_chunk_prefix};
- 
--  dbg("rules: run_generic_tests - compiling eval code: %s, priority %s",
--      $ruletype, $priority);
--# dbg("rules: eval code to compile: $evalstr");
--  my $eval_result;
--  { my $timer = $self->{main}->time_method('compile_gen');
--    $eval_result = eval($evalstr);
--  }
--  if (!$eval_result) {
--    my $eval_stat = $@ ne '' ? $@ : "errno=$!";  chomp $eval_stat;
--    warn "rules: failed to compile $ruletype tests, skipping:\n".
--         "\t($eval_stat)\n";
--    $pms->{rule_errors}++;
--  }
--  else {
-+    dbg("rules: run_generic_tests - compiling eval code: %s, priority %s",
-+        $ruletype, $priority);
-+  # dbg("rules: eval code to compile: $evalstr");
-+    my $eval_result;
-+    { my $timer = $self->{main}->time_method('compile_gen');
-+      $eval_result = eval($evalstr);
-+    }
-+    if (!$eval_result) {
-+      my $eval_stat = $@ ne '' ? $@ : "errno=$!";  chomp $eval_stat;
-+      warn "rules: failed to compile $ruletype tests, skipping:\n".
-+           "\t($eval_stat)\n";
-+      $pms->{rule_errors}++;
-+      return;
-+    }
-     dbg("rules: compiled $ruletype tests");
--    goto run_compiled_method;
-   }
-+
-+#run_compiled_method:
-+# dbg("rules: run_generic_tests - calling %s", $methodname);
-+  my $t = Mail::SpamAssassin::Timeout->new({ deadline => $master_deadline });
-+  my $err = $t->run(sub {
-+    no strict "refs";
-+    $methodname->($pms, @{$opts{args}});
-+  });
-+  if ($t->timed_out() && $master_deadline && time > $master_deadline) {
-+    info("check: exceeded time limit in $methodname, skipping further tests");
-+    $pms->{deadline_exceeded} = 1;
-+  }
- }
- 
- sub begin_evalstr_chunk {
-Index: lib/Mail/SpamAssassin/Plugin/BodyEval.pm
-===================================================================
---- lib/Mail/SpamAssassin/Plugin/BodyEval.pm	(revision 943932)
-+++ lib/Mail/SpamAssassin/Plugin/BodyEval.pm	(revision 943933)
-@@ -119,7 +119,7 @@
-         }
- 
- 	# If there are no words, mark if there's at least 1 image ...
--	if (keys %html == 0 && exists $pms->{html}{inside}{img}) {
-+	if (!%html && exists $pms->{html}{inside}{img}) {
- 	  # Use "\n" as the mark since it can't ever occur normally
- 	  $html{"\n"}=1;
- 	}
diff -bBru /var/tmp/sa331/files/patch-bug6396 ./files/patch-bug6396
--- /var/tmp/sa331/files/patch-bug6396	2010-10-06 06:38:09.000000000 -0400
+++ ./files/patch-bug6396	2011-06-24 06:37:44.000000000 -0400
@@ -1,13 +0,0 @@
-Index: lib/Mail/SpamAssassin/Plugin/MIMEEval.pm
-===================================================================
---- lib/Mail/SpamAssassin/Plugin/MIMEEval.pm	(revision 929342)
-+++ lib/Mail/SpamAssassin/Plugin/MIMEEval.pm	(revision 929343)
-@@ -498,7 +498,7 @@
-     # perhaps just limit to test, and image?
-     next if ($ctype eq 'application/ics');
- 
--    my $cte = lc $p->get_header('content-transfer-encoding') || '';
-+    my $cte = lc($p->get_header('content-transfer-encoding') || '');
-     next if ($cte !~ /^base64$/);
-     foreach my $l ( @{$p->raw()} ) {
-       my $len = length $l;
diff -bBru /var/tmp/sa331/files/patch-bug6488 ./files/patch-bug6488
--- /var/tmp/sa331/files/patch-bug6488	2011-06-07 19:23:51.000000000 -0400
+++ ./files/patch-bug6488	2011-06-24 06:37:51.000000000 -0400
@@ -1,18 +0,0 @@
-BUG 6488 - Lint errors with Perl 5.12.1 in AntiVirus.pm
-
-Index: lib/Mail/SpamAssassin/Plugin/AntiVirus.pm
-=========================================================================
---- lib/Mail/SpamAssassin/Plugin/AntiVirus.pm	(revision 574664)
-+++ lib/Mail/SpamAssassin/Plugin/AntiVirus.pm	(revision 1028149)
-@@ -98,9 +98,9 @@
-     my ($ctype, $boundary, $charset, $name) =
-       Mail::SpamAssassin::Util::parse_content_type($p->get_header('content-type'));
- 
--    $name = lc $name || '';
-+    $name = lc($name || '');
- 
--    my $cte = lc $p->get_header('content-transfer-encoding') || '';
-+    my $cte = lc($p->get_header('content-transfer-encoding') || '');
-     $ctype = lc $ctype;
- 
-     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)$/)
diff -bBru /var/tmp/sa331/files/patch-bug6624 ./files/patch-bug6624
--- /var/tmp/sa331/files/patch-bug6624	2011-06-24 13:27:06.000000000 -0400
+++ ./files/patch-bug6624	2011-06-24 13:26:12.000000000 -0400
@@ -0,0 +1,88 @@
+--- lib/Mail/SpamAssassin/BayesStore/MySQL.pm	(revision 1138970)
++++ lib/Mail/SpamAssassin/BayesStore/MySQL.pm	(working copy)
+@@ -840,14 +840,28 @@
+       return 0;
+     }
+ 
++    # With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if
++    # the row is inserted as a new row and 2 if an existing row is updated.
++    #
++    # Due to a MySQL server bug a value of 3 can be seen.
++    # See: http://bugs.mysql.com/bug.php?id=46675
++    #   When executing the INSERT ... ON DUPLICATE KEY UPDATE statement
++    #   and checking the rows return count:
++    #   mysql_client_found_rows = 0: The second INSERT returns a row count
++    #                                of 2 in all MySQL versions.
++    #   mysql_client_found_rows = 1: The second INSERT returns this row count:
++    #     Before MySQL 5.1.20: 2
++    #     MySQL 5.1.20: undef on Mac OS X, 139775481 on Linux (garbage?)
++    #     MySQL 5.1.21 and up: 3
++    #
+     my $num_rows = $rc;
+ 
+     $sth->finish();
+ 
+-    if ($num_rows == 1 || $num_rows == 2) {
++    if ($num_rows == 1 || $num_rows == 2 || $num_rows == 3) {
+       my $token_count_update = '';
+       
+-      $token_count_update = "token_count = token_count + 1," if ($num_rows == 1);
++      $token_count_update = "token_count = token_count + 1," if $num_rows == 1;
+       $sql = "UPDATE bayes_vars SET
+                      $token_count_update
+                      newest_token_age = GREATEST(newest_token_age, ?),
+@@ -872,7 +886,11 @@
+     }
+     else {
+       # $num_rows was not what we expected
+-      dbg("bayes: _put_token: Updated an unexpected number of rows.");
++      my $token_displ = $token;
++      $token_displ =~ s/(.)/sprintf('%02x',ord($1))/egs;
++      dbg("bayes: _put_token: Updated an unexpected number of rows: %s, ".
++          "id: %s, token (hex): %s",
++          $num_rows, $self->{_userid}, $token_displ);
+       $self->{_dbh}->rollback();
+       return 0;
+     }
+@@ -987,8 +1005,24 @@
+       else {
+ 	my $num_rows = $rc;
+ 
+-	$need_atime_update_p = 1 if ($num_rows == 1 || $num_rows == 2);
+-	$new_tokens++ if ($num_rows == 1);
++        # With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if
++        # the row is inserted as a new row and 2 if an existing row is updated.
++        # But see MySQL bug (as above): http://bugs.mysql.com/bug.php?id=46675
++
++        if ($num_rows == 1) {
++          $new_tokens++;
++          $need_atime_update_p = 1;
++        } elsif ($num_rows == 2 || $num_rows == 3) {
++          $need_atime_update_p = 1;
++        } else {
++          # $num_rows was not what we expected
++          my $token_displ = $token;
++          $token_displ =~ s/(.)/sprintf('%02x',ord($1))/egs;
++          dbg("bayes: _put_tokens: Updated an unexpected number of rows: %s, ".
++              "id: %s, token (hex): %s",
++              $num_rows, $self->{_userid}, $token_displ);
++          $error_p = 1;
++        }
+       }
+     }
+ 
+@@ -1026,10 +1060,10 @@
+       }
+     }
+     else {
+-      # $num_rows was not what we expected
+-      dbg("bayes: _put_tokens: Updated an unexpected number of rows.");
+-      $self->{_dbh}->rollback();
+-      return 0;
++      info("bayes: _put_tokens: no atime updates needed?  Num of tokens: %d",
++           scalar keys %{$tokens});
++#     $self->{_dbh}->rollback();
++#     return 0;
+     }
+   }
+ 
diff -bBru /var/tmp/sa331/pkg-install ./pkg-install
--- /var/tmp/sa331/pkg-install	2011-06-07 19:23:51.000000000 -0400
+++ ./pkg-install	2011-06-24 13:39:33.000000000 -0400
@@ -1,9 +1,7 @@
 #!/bin/sh
 PKG_PREFIX=${PKG_PREFIX:-/usr/local}
-USER=spamd
-GROUP=${USER}
-UID=58
-GID=${UID}
+USER=${USER:-spamd}
+GROUP=${GROUP:-spamd}
 HOME=/var/spool/${USER}
 
 if [ "$2" = "POST-INSTALL" ];then
@@ -34,10 +32,10 @@
 }
 
     # Create pid directory
-    install -d -g ${USER} -g ${GROUP} /var/run/spamd
+    install -d -o ${USER} -g ${GROUP} /var/run/spamd
     /usr/bin/su root -c "${PKG_PREFIX}/bin/spamassassin -x -L --lint"
 
-    if [ ${?} -eq 255 ];then
+    if [ ${?} -eq 9 ];then
         echo "***********************************************"
         echo "*__        ___    ____  _   _ ___ _   _  ____ *"
         echo "*\ \      / / \  |  _ \| \ | |_ _| \ | |/ ___|*"
diff -bBru /var/tmp/sa331/pkg-plist ./pkg-plist
--- /var/tmp/sa331/pkg-plist	2010-02-10 08:37:11.000000000 -0500
+++ ./pkg-plist	2011-06-24 07:56:24.000000000 -0400
@@ -1,5 +1,4 @@
-@unexec %D/etc/rc.d/sa-spamd.sh stop > /dev/null 2>&1 || true
-@unexec %D/etc/rc.d/sa-spamd stop > /dev/null 2>&1 || true
+@stopdaemon sa-spamd
 bin/sa-awl
 bin/sa-check_spamd
 bin/sa-compile
@@ -134,7 +133,7 @@
 @unexec rm -rf /var/lib/spamassassin/2* || true
 @unexec rmdir /var/lib/spamassassin 2>/dev/null  || true
 @unexec rmdir /var/lib 2>/dev/null || true
-@unexec rmdir /var/db/spamassassin || true
+@unexec rmdir /var/db/spamassassin 2>/dev/null || true
 @dirrm %%DATADIR%%
 @dirrm %%SITE_PERL%%/%%PERL_ARCH%%/auto/Mail/SpamAssassin
 @dirrmtry %%SITE_PERL%%/%%PERL_ARCH%%/auto/Mail
@@ -151,4 +150,4 @@
 @dirrmtry %%SITE_PERL%%/Mail
 @dirrmtry etc/mail/spamassassin
 @dirrmtry etc/mail
-@dirrmtry /var/run/spamd
+@unexec rm -rf /var/run/spamd || true


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201106241927.p5OJR7u8072377>