1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
#!/usr/bin/perl
use lib '.'; use lib 't';
use SATest; sa_t_init("recursion");
use Test; BEGIN { plan tests => 10 };
use IO::File;
# ---------------------------------------------------------------------------
%patterns = (
q{X-Spam-Status: }, 'headerfound',
);
# ---------------------------------------------------------------------------
my $msg1 = q{From: foo
Message-Id: <bar>
To: baz
Subject: testing recursion
Content-Type: multipart/report; report-type=delivery-status;
boundary="__BOUND__"
--__BOUND__
This is the report.
--__BOUND__
Content-Type: message/delivery-status
Reporting-MTA: dns; example.org
Diagnostic-Info: hi!
--__BOUND__
Content-Type: message/rfc822
__MSG__
--__BOUND__--
};
my $msg2 = q{From: foo
Message-Id: <bar>
To: baz
Subject: testing recursion 2
Content-Type: multipart/mixed; boundary="__BOUND__"
--__BOUND__
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
hi!
--__BOUND__
Content-Type: message/rfc822
MIME-Version: 1.0
__MSG__
--__BOUND__--
};
# ---------------------------------------------------------------------------
sub create_test_message {
my $msg = shift;
my $boundstr = "AAAAAAAAAAAAAAAAAAA";
my $bound = $boundstr; $boundstr++;
my $text = $msg;
$text =~ s/__BOUND__/${bound}/g;
for my $i (1 .. 600) {
my $newmsg = $msg;
$bound = $boundstr; $boundstr++;
$newmsg =~ s/__BOUND__/${bound}/g;
$newmsg =~ s/__MSG__/${text}/g;
$text = $newmsg;
}
open (OUT, ">log/recurse.eml") or die;
print OUT $text;
close OUT or die;
}
sub create_test_message_3 {
my $boundstr = "AAAAAAAAAAAAAAAAAAA";
my $bound = $boundstr; $boundstr++;
my $text = q{From: foo
Message-Id: <bar>
To: baz
Subject: testing recursion 2
};
for my $i (1 .. 600) {
$text .= qq{Content-Type: multipart/mixed; boundary="$boundstr"
--$boundstr
};
$boundstr++;
}
open (OUT, ">log/recurse.eml") or die;
print OUT $text;
close OUT or die;
}
sub try_scan {
my $fh = IO::File->new_tmpfile();
ok($fh);
open(STDERR, ">&=".fileno($fh)) || die "Cannot reopen STDERR";
sarun("-D -L -t < log/recurse.eml",
\&patterns_run_cb);
seek($fh, 0, 0);
my $error = do {
local $/;
<$fh>;
};
print "# $error\n";
if ($error =~ /Deep recursion on subroutine/) { ok(0); }
else { ok(1); }
ok_all_patterns();
}
create_test_message($msg1);
try_scan();
create_test_message($msg2);
try_scan();
create_test_message_3();
try_scan();
ok(unlink 'log/recurse.eml');
|