You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by si...@apache.org on 2022/06/13 10:09:29 UTC
svn commit: r1901875 - in /spamassassin/trunk: lib/Mail/SpamAssassin/Plugin/Pyzor.pm lib/Mail/SpamAssassin/Plugin/Razor2.pm lib/Mail/SpamAssassin/Util.pm spamd/spamd.raw
Author: sidney
Date: Mon Jun 13 10:09:28 2022
New Revision: 1901875
URL: http://svn.apache.org/viewvc?rev=1901875&view=rev
Log:
bug 8007 - POSIX::_exit in forked child on Windows terminates parent, use exit() instead if on Windows
Modified:
spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Pyzor.pm
spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Razor2.pm
spamassassin/trunk/lib/Mail/SpamAssassin/Util.pm
spamassassin/trunk/spamd/spamd.raw
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Pyzor.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Pyzor.pm?rev=1901875&r1=1901874&r2=1901875&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Pyzor.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Pyzor.pm Mon Jun 13 10:09:28 2022
@@ -38,14 +38,14 @@ use Mail::SpamAssassin::Plugin;
use Mail::SpamAssassin::Logger;
use Mail::SpamAssassin::Timeout;
use Mail::SpamAssassin::Util qw(untaint_var untaint_file_path
- proc_status_ok exit_status_str);
+ proc_status_ok exit_status_str force_die);
use strict;
use warnings;
# use bytes;
use re 'taint';
use Storable;
-use POSIX qw(PIPE_BUF WNOHANG _exit);
+use POSIX qw(PIPE_BUF WNOHANG);
our @ISA = qw(Mail::SpamAssassin::Plugin);
@@ -356,8 +356,7 @@ sub check_pyzor {
$SIG{PIPE} = 'IGNORE';
$SIG{$_} = sub {
eval { dbg("pyzor: child process $$ caught signal $_[0]"); };
- _exit(6); # avoid END and destructor processing
- kill('KILL',$$); # still kicking? die!
+ force_die(6); # avoid END and destructor processing
} foreach qw(INT HUP TERM TSTP QUIT USR1 USR2);
dbg("pyzor: child process $$ forked");
$pms->{pyzor_backchannel}->setup_backchannel_child_post_fork();
@@ -368,12 +367,12 @@ sub check_pyzor {
};
if ($@) {
dbg("pyzor: child return value freeze failed: $@");
- _exit(0); # avoid END and destructor processing
+ force_die(0); # avoid END and destructor processing
}
if (!syswrite($pms->{pyzor_backchannel}->{parent}, $backmsg)) {
dbg("pyzor: child backchannel write failed: $!");
}
- _exit(0); # avoid END and destructor processing
+ force_die(0); # avoid END and destructor processing
}
$pms->{pyzor_pid} = $pid;
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Razor2.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Razor2.pm?rev=1901875&r1=1901874&r2=1901875&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Razor2.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Razor2.pm Mon Jun 13 10:09:28 2022
@@ -44,13 +44,14 @@ use Mail::SpamAssassin::Plugin;
use Mail::SpamAssassin::Logger;
use Mail::SpamAssassin::Timeout;
use Mail::SpamAssassin::SubProcBackChannel;
+use Mail::SpamAssassin::Util qw(force_die);
use strict;
use warnings;
# use bytes;
use re 'taint';
use Storable;
-use POSIX qw(PIPE_BUF WNOHANG _exit);
+use POSIX qw(PIPE_BUF WNOHANG);
our @ISA = qw(Mail::SpamAssassin::Plugin);
@@ -468,8 +469,7 @@ sub check_razor2 {
$SIG{PIPE} = 'IGNORE';
$SIG{$_} = sub {
eval { dbg("razor2: child process $$ caught signal $_[0]"); };
- _exit(6); # avoid END and destructor processing
- kill('KILL',$$); # still kicking? die!
+ force_die(6); # avoid END and destructor processing
} foreach qw(INT HUP TERM TSTP QUIT USR1 USR2);
dbg("razor2: child process $$ forked");
$pms->{razor2_backchannel}->setup_backchannel_child_post_fork();
@@ -481,12 +481,12 @@ sub check_razor2 {
};
if ($@) {
dbg("razor2: child return value freeze failed: $@");
- _exit(0); # avoid END and destructor processing
+ force_die(0); # avoid END and destructor processing
}
if (!syswrite($pms->{razor2_backchannel}->{parent}, $backmsg)) {
dbg("razor2: child backchannel write failed: $!");
}
- _exit(0); # avoid END and destructor processing
+ force_die(0); # avoid END and destructor processing
}
$pms->{razor2_pid} = $pid;
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Util.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Util.pm?rev=1901875&r1=1901874&r2=1901875&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Util.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Util.pm Mon Jun 13 10:09:28 2022
@@ -59,7 +59,7 @@ our @EXPORT_OK = qw(&local_tz &base64_de
&secure_tmpdir &uri_list_canonicalize &get_my_locales
&parse_rfc822_date &idn_to_ascii &is_valid_utf_8
&get_user_groups &compile_regexp &qr_to_string
- &is_fqdn_valid &parse_header_addresses
+ &is_fqdn_valid &parse_header_addresses &force_die
&domain_to_search_list);
our $AM_TAINTED;
@@ -1944,16 +1944,22 @@ sub helper_app_pipe_open_windows {
}
sub force_die {
- my ($msg) = @_;
+ my ($statrc, $msg) = @_;
# note use of eval { } scope in logging -- paranoia to ensure that a broken
# $SIG{__WARN__} implementation will not interfere with the flow of control
# here, where we *have* to die.
- eval { warn $msg }; # hmm, STDERR may no longer be open
- eval { dbg("util: force_die: $msg") };
+ if ($msg) {
+ eval { warn $msg }; # hmm, STDERR may no longer be open
+ eval { dbg("util: force_die: $msg") };
+ }
- POSIX::_exit(6); # avoid END and destructor processing
- kill('KILL',$$); # still kicking? die!
+ if (am_running_on_windows()) {
+ exit($statrc); # on Windows _exit would terminate parent too BUG 8007
+ } else {
+ POSIX::_exit($statrc); # avoid END and destructor processing
+ kill('KILL',$$) if ($statrc); # somehow this breaks those places that are calling it to exit(0)
+ }
}
sub helper_app_pipe_open_unix {
@@ -2058,7 +2064,7 @@ sub helper_app_pipe_open_unix {
my $eval_stat = $@ ne '' ? $@ : "errno=$!"; chomp $eval_stat;
# bug 4370: we really have to exit here; break any eval traps
- force_die(sprintf('util: failed to spawn a process "%s": %s',
+ force_die(6, sprintf('util: failed to spawn a process "%s": %s',
join(", ",@cmdline), $eval_stat));
die; # must be a die() otherwise -w will complain
}
Modified: spamassassin/trunk/spamd/spamd.raw
URL: http://svn.apache.org/viewvc/spamassassin/trunk/spamd/spamd.raw?rev=1901875&r1=1901874&r2=1901875&view=diff
==============================================================================
--- spamassassin/trunk/spamd/spamd.raw (original)
+++ spamassassin/trunk/spamd/spamd.raw Mon Jun 13 10:09:28 2022
@@ -249,12 +249,12 @@ use Mail::SpamAssassin::SpamdForkScaling
use Mail::SpamAssassin::Logger qw(:DEFAULT log_message);
use Mail::SpamAssassin::Util qw(untaint_var untaint_file_path secure_tmpdir
exit_status_str am_running_on_windows
- get_user_groups);
+ get_user_groups force_die);
use Mail::SpamAssassin::Timeout;
use Getopt::Long;
use POSIX qw(:sys_wait_h);
-use POSIX qw(locale_h setsid sigprocmask _exit);
+use POSIX qw(locale_h setsid sigprocmask);
use Errno;
use Fcntl qw(:flock);
@@ -2144,7 +2144,7 @@ sub check {
# ensure we didn't accidentally fork (bug 4370)
if ($starting_self_pid != $$) {
eval { warn("spamd: accidental fork: $$ != $starting_self_pid"); };
- POSIX::_exit(1); # avoid END and dtor processing
+ force_die(0); # avoid END and dtor processing
}
return 1;