Package: amavis-ng
Version: 0.1.6.8-1
Severity: grave
Tags: patch
Justification: renders package unusable




Hi !

There is still the problem with amavis-ng and the Exim.pm module. On an debian 
unstable system, the variables "exim" and "args" cannot be passed due to a
programming error, making the whole program abort.


Fix:
Exchange the two lines (l.32/l.33) in Exim.pm as follows:

$cfg_exim_binary = $AMAVIS::cfg->val('Exim' , 'exim');
$cfg_exim_args = $AMAVIS::cfg->val('Exim', 'args' );


This is the same as in most of the other scripts. It simply does not the buggy
default value check. Sorry, I am not a professional in perl so I cannot tell you
exactly what the syntax error is in the original files.

Best regards,
Sebastian




-- System Information:
Debian Release: 3.1
  APT prefers unstable
  APT policy: (500, 'unstable'), (500, 'testing')
Architecture: i386 (i686)
Kernel: Linux 2.6.8
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)

Versions of packages amavis-ng depends on:
ii  debconf                       1.4.41     Debian configuration management sy
ii  libconfig-inifiles-perl       2.38-3     Read .ini-style configuration file
ii  libfile-mmagic-perl           1.22-1     Perl module to guess file type
ii  libmime-perl                  5.415-1    Perl5 modules for MIME-compliant m
ii  libnet-perl                   1:1.19-1   Implementation of Internet protoco
ii  logrotate                     3.7-2      Log rotation utility
ii  perl [libmime-base64-perl]    5.8.4-5    Larry Wall's Practical Extraction 
ii  perl-modules [libnet-perl]    5.8.4-5    Core Perl modules
ii  perl-suid                     5.8.4-5    Runs setuid Perl scripts

-- debconf information:
  amavis-ng/filename-changes:
# $Id: Exim.pm,v 1.22 2005/01/13 00:14:33 braeucup Exp $

#
# MTA module for "regular" Exim setup
#

package AMAVIS::MTA::Exim;
use strict;
use vars qw($VERSION);
$VERSION='0.1';

use AMAVIS;
use AMAVIS::Logging;
use IO::File;
use File::Path;

use File::Copy;
use Sys::Hostname;


use vars qw(
            $cfg_exim_binary
            $cfg_exim_args
            $cfg_x_header
            $cfg_x_header_tag
            $cfg_x_header_line
           );

sub init {
  my $self = shift;
  my $args = shift;
# does not work, so using the old-fashioned way:
#  $cfg_exim_binary = (($AMAVIS::cfg->val('Exim', 'exim') =~ s/[^\w]//g) || 
'/usr/sbin/exim');
#  $cfg_exim_args = (($AMAVIS::cfg->val('Exim', 'args') =~ s/[^\w]//g) || '-oMr 
no-scan -i -f');
  $cfg_exim_binary = $AMAVIS::cfg->val('Exim', 'exim');
  $cfg_exim_args = $AMAVIS::cfg->val('Exim', 'args');



  if (! -x $cfg_exim_binary) {
    writelog($args,LOG_CRIT, "$cfg_exim_binary not executable");
    return 0;
  }

  if (($AMAVIS::cfg->val('global', 'x-header') || '') eq 'true') {
    $cfg_x_header = 1
  };
  $cfg_x_header_tag = $AMAVIS::cfg->val('global', 'x-header-tag');
  $cfg_x_header_line = $AMAVIS::cfg->val('global', 'x-header-line');

  writelog($args,LOG_DEBUG,__PACKAGE__." initialized.");
  # Return successfully
  return 1;
}

sub cleanup {
  my $self = shift;
  my $args = shift;
  return 1;
}

# Create temp dir and write mail
sub get_directory {
  my $self = shift;
  my $args = shift;

  # Create temp directory. Try creating $prefix[date]-[pid] 
  # If unsuccessful after 10 tries, abort
  my $prefix = "$AMAVIS::cfg_unpack_dir/amavis-unpack-";
  my $i = 0;
  my $message_id;
  while (1) {
    $message_id = sprintf("%.8x-%.4x",time,$$);
    unless (defined mkpath ($prefix.$message_id, 0, 0770)) {
      if (++$i > 10) {
        return 0;
      }
      else {
        next;
      }
    }
    last;
  }
  $$args{'message_id'}=$message_id;
  my $directory = $prefix.$message_id;
  mkdir "$directory/parts", 0777;
  $$args{'directory'} = $directory;

  # Open message file that is later going to be disected and scanned
  my $output = IO::File->new("+>$directory/email.txt");

  # Get message from STDIN
  my $headers=1;
  $$args{'headers'}='';
  while (<STDIN>) {
    if (/^ *$/) {
      $headers=0;
    }
    if ($headers==1) {
      $$args{'headers'}.=$_;
    }
    print $output $_;
  }

  if ($#ARGV < 1) {
    writelog($args,LOG_ERR, __PACKAGE__.": Missing arguments to exim");
    return 0;
  }

  writelog($args,LOG_DEBUG, "Called as amavis ".join(' ',@ARGV));

  foreach (@ARGV) {
    /^-f$/ && next; # ignore "-f"
    /^-d$/ && next; # ignore "-d"
    /^(.*)$/; # untaint sender or recipient
    unless (defined $$args{'sender'}) {
      my $sender = $1;
      if ($sender =~ /^$/) {
        $sender= "<>";
      }
      writelog($args,LOG_DEBUG, "Sender: $sender");
      $$args{'sender'} = $sender;
    }
    else {
      my $recipient = $1;
      writelog($args,LOG_DEBUG, "Recipient: $recipient"); 
      push @{$$args{'recipients'}}, $recipient;
    }
  }

  # Message file has been written, reset file pointer and put it into
  # the record.
  $output->seek(0,0);
  $$args{'filehandle'} = $output;

  # Return successfully
  return 1;
}

# Generate a copy of the scanned message and pipe it to mailer.
sub accept_message {
  my $self = shift;
  my $args = shift;
  writelog($args,LOG_INFO, __PACKAGE__.": Accepting message");
  my @cfg_exim_args;

  push @cfg_exim_args, split(/\s+/,$cfg_exim_args);
  push @cfg_exim_args, $$args{'sender'};
  push @cfg_exim_args, @{$$args{'recipients'}};

  writelog($args,LOG_DEBUG, __PACKAGE__.": Running $cfg_exim_binary ".
           join(' ',@cfg_exim_args));

  open(MAIL, "|-") || exec($cfg_exim_binary, @cfg_exim_args);
  # Copy the original message headers.
  while (my $line=$$args{'filehandle'}->getline()) {
    last if ($line =~ /^ *$/);
    print MAIL $line;
  }
  # Insert our headers.
  if ($cfg_x_header) {
    print MAIL "$cfg_x_header_tag: $cfg_x_header_line\n";
  }
  # Print an empty line.
  print MAIL "\n";
  # Copy the original message body.
  while (my $line=$$args{'filehandle'}->getline()) {
    print MAIL $line;
  }
  close(MAIL);

  if ($? != 0) {
    writelog($args,LOG_ERR, __PACKAGE__.": $cfg_exim_binary exited with 
".($?>>8));
  }

  $$args{'status'} = 'accept';

  # Return successfully
  return 1;
}

# Just "forget" the mail.
sub drop_message {
  my $self = shift;
  my $args = shift;
  # Doing nothing should suffice
  writelog($args,LOG_WARNING, __PACKAGE__.": Dropping message");

  # Return successfully
  return 1;
}

sub freeze_message {
  my $self = shift;
  my $args = shift;
  writelog($args,LOG_WARNING, __PACKAGE__.": Freezing message");

  # Instead of freezing, drop the message, but store a copy in
  # $cfg_problem_dir -- analogous to AMAVIS::quarantine_message()
  if (AMAVIS->quarantine_problem_message($args)) {
    # Return successfully
    return 1;
  }
  else {
    writelog($args,LOG_ERR,__PACKAGE__.": Could not freeze message");
    return 0;
  }
}

# Called from Notify::*.pm, i.e. for sending warining messages
sub send_message {
  my $self = shift;
  my $args = shift;
  my $message = shift;
  my $sender = shift;
  my @recipients = @_;
  writelog($args,LOG_DEBUG, __PACKAGE__.": Sending mail from $sender to ".
           join(', ',@recipients));

  my @cfg_exim_args;

  push @cfg_exim_args, split(/\s+/,$cfg_exim_args);
  push @cfg_exim_args, $sender;
  push @cfg_exim_args, @recipients;

  writelog($args,LOG_DEBUG, __PACKAGE__.": Running $cfg_exim_binary ".
           join(' ',@cfg_exim_args));

  open(MAIL, "|-") || exec($cfg_exim_binary, @cfg_exim_args);
  print MAIL $message;
  close(MAIL);

  if ($? != 0) {
    writelog($args,LOG_ERR,
             __PACKAGE__.": $cfg_exim_binary @cfg_exim_args exited with 
".($?>>8));
  }

  # Return successfully
  return 1;
}

1;

Reply via email to