aboutsummaryrefslogtreecommitdiff
path: root/selfunload.pl
blob: 20653d75e757dc8787eb8b8bf484b1378ddf73b1 (plain)
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
#!/usr/bin/perl

# A script that tries to unload itself while it's running. This causes
# irssi to segfault. It isn't a surprise that a script can't safely
# unload itself, but it sort of is a surprise that irssi segfaults.
# I'd expect it to give an error message and not segfault.

# Save this file as:     ~/.irssi/scripts/selfunload.pl
# Load it in irssi with:  /script load selfunload
# Execute with:           /selfunload

# gdb backtrace of the core file it produces:
# #0  0x00002b24a04a4c12 in free () from /lib64/libc.so.6
# #1  0x00000000004a05d5 in perl_script_unload ()
# (no, I don't have debug symbols in my irssi binary, sorry).

use warnings;
use strict;

use Irssi qw/command command_bind/;

our $VERSION = "0.0";
our %IRSSI = (
		authors     => 'B. Watson',
		contact     => 'yalhcru@gmail.com or Urchlay on FreeNode ##slackware',
		name        => 'selfunload',
		description => 'script that makes irssi segfault'
		license     => 'WTFPL',
		url         => 'http://urchlay.naptime.net/repos/misc-scripts/plain/selfunload.pl',
);

sub selfunload {
	# Attempt to unload myself while I'm running:
	command("/script unload selfunload");

	# The next command never executes, we've already segfaulted irssi!
	command("/echo unloaded");
}

command_bind("selfunload", "selfunload");