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;