/
forkbomb.perl
74 lines (66 loc) · 1.71 KB
/
forkbomb.perl
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
#!perl -w -I../lib
# Copyright 1998 Rocco Caputo <troc@netrus.net>. All rights reserved.
# This is a pre-release version. Redistribution and modification are
# prohibited.
package main;
use strict;
use POE::Kernel;
use POE::Session;
open STDERR, '>&STDOUT';
my $kernel = new POE::Kernel();
my $forkbomber = 0;
sub forkbomb {
my $kernel = shift;
new POE::Session
(
$kernel,
'_start' => sub
{
my ($k, $me, $from) = @_;
$me->{'id'} = ++$forkbomber;
print $me->{'id'}, ": starting...\n";
$k->sig('INT', 'signal handler');
$k->post_state($me, 'fork');
},
'_stop' => sub
{
my ($k, $me, $from) = @_;
print $me->{'id'}, ": stopping...\n";
},
'_child' => sub
{
my ($k, $me, $child_session) = @_;
print $me->{'id'}, ": child $child_session stopped...\n";
},
'_parent' => sub
{
my ($k, $me, $new_parent) = @_;
print $me->{'id'}, ": parent now is $new_parent ...\n";
},
'signal handler' => sub
{
my ($k, $me, $from, $signal) = @_;
print $me->{'id'}, ": caught SIG$signal\n";
},
'fork' => sub
{
my ($k, $me, $from) = @_;
print $me->{'id'}, ": starting new child...\n";
if ($forkbomber < 1000) {
&forkbomb($k);
if (($forkbomber < 500) || (rand() < 0.5)) {
$k->post_state($me, 'fork');
}
else {
print $me->{'id'}, ": preparing to stop...\n";
}
}
else {
print $me->{'id'}, ": forkbomber limit reached, b'bye!\n";
}
},
);
}
#------------------------------------------------------------------------------
&forkbomb($kernel);
$kernel->run();