Index: lib/Mail/SpamAssassin.pm =================================================================== --- lib/Mail/SpamAssassin.pm (revision 465206) +++ lib/Mail/SpamAssassin.pm (working copy) @@ -1464,6 +1464,31 @@ # TODO -- open DNS cache etc. if necessary } +sub in_sub_process { + my ($self, $code) = @_; + my $rand = rand(); + my $file = ".tmp.$$.$rand.answer"; + +use Storable; + my $cpid = fork; + if ($cpid) { + wait; + open (my $fh, $file); + my $data = do { local $/; <$fh> }; + my $res = eval { Storable::thaw($data); }; + unlink $file; + return $res; + } + + my $res = $code->(); + if (open (my $fh, ">$file.writing")) { + print $fh Storable::nfreeze($res); + CORE::close($fh); + rename "$file.writing", $file; + exit 0; + } +} + sub read_cf { my ($self, $allpaths, $desc) = @_; return $self->_read_cf_pre($allpaths,$desc,\&get_cf_files_in_dir); Index: lib/Mail/SpamAssassin/Conf.pm =================================================================== --- lib/Mail/SpamAssassin/Conf.pm (revision 465206) +++ lib/Mail/SpamAssassin/Conf.pm (working copy) @@ -2661,15 +2661,39 @@ ########################################################################### sub parse_scores_only { - my ($self) = @_; $_[0]->{parser}->parse ($_[1], 1); } -sub parse_rules { - my ($self) = @_; +sub OLD_parse_rules { $_[0]->{parser}->parse ($_[1], 0); } +sub parse_rules { + my ($self, $str) = @_; + + my @wanted = qw( errors descriptions test_types scoreset + scoreset_current tflags body_tests uri_tests uri_evals head_tests + head_evals body_evals full_tests full_evals rawbody_tests rawbody_evals + meta_tests regression_tests rewrite_header user_rules_to_compile + user_defined_rules headers_spam headers_ham bayes_ignore_headers + bayes_ignore_from bayes_ignore_to whitelist_from whitelist_allows_relays + blacklist_from blacklist_to whitelist_to more_spam_to all_spam_to + trusted_networks internal_networks headers_spam headers_ham + num_check_received bayes_expiry_pct bayes_expiry_period + bayes_expiry_max_exponent encapsulated_content_description); + + my $back = $self->{main}->in_sub_process(sub { + $self->{parser}->parse ($str, 0); + my %back = (); + foreach my $want (@wanted) { $back{$want} = $self->{$want}; } + warn "read config in subprocess"; + return \%back; + }); + + foreach my $want (@wanted) { $self->{$want} = $back->{$want}; } + +} + ########################################################################### sub set_score_set {