mirror of
https://github.com/irssi/irssi.git
synced 2026-08-08 19:30:15 +02:00
4.6 KiB
4.6 KiB
Building Irssi with Nix
This project includes a Nix flake for reproducible builds and development environments.
Prerequisites
- Nix with flakes enabled
To enable flakes, add to ~/.config/nix/nix.conf:
experimental-features = nix-command flakes
Quick Start
# Build irssi
nix build
# Run irssi
./result/bin/irssi
# Enter development shell
nix develop
Available Packages
| Package | Description |
|---|---|
irssi (default) |
Full build with Perl scripting and proxy support |
irssi-minimal |
Build without Perl scripting support |
fuzz |
Fuzz targets with AddressSanitizer + UndefinedBehaviorSanitizer |
fuzz-asan |
Fuzz targets with AddressSanitizer only |
fuzz-ubsan |
Fuzz targets with UndefinedBehaviorSanitizer only |
Building Packages
# Build default (full irssi)
nix build
# Build minimal variant
nix build .#irssi-minimal
# Build fuzzers (recommended: ASan + UBSan)
nix build .#fuzz
# Build fuzzers with only ASan (faster)
nix build .#fuzz-asan
Development Shells
| Shell | Description |
|---|---|
default |
Standard development with gcc, gdb, valgrind |
fuzz |
Fuzzing development with clang + libFuzzer |
Using Development Shells
# Standard development
nix develop
meson setup Build
ninja -C Build
ninja -C Build test
# Fuzzing development
nix develop .#fuzz
meson setup Build-fuzz -Dwith-perl=no -Dwithout-textui=yes -Dwith-fuzzer=yes
ninja -C Build-fuzz
Fuzzing
The project includes five fuzz targets built with libFuzzer:
| Fuzzer | Tests |
|---|---|
irssi-fuzz |
Text formatting (printtext_string()) |
server-fuzz |
IRC protocol message parsing |
dcc-fuzz |
DCC protocol message parsing (SEND, CHAT, RESUME, ACCEPT) |
event-get-params-fuzz |
IRC event parameter parsing |
theme-load-fuzz |
Theme file loading |
Building Fuzzers
# Build with ASan + UBSan (recommended for finding bugs)
nix build .#fuzz
# Build with ASan only (faster execution)
nix build .#fuzz-asan
Running Fuzzers
# Basic fuzzing (creates corpus automatically)
./result/bin/irssi-fuzz corpus/irssi-fuzz/
# With dictionary (recommended for server-fuzz and dcc-fuzz)
./result/bin/server-fuzz -dict=src/fe-fuzz/tokens.txt corpus/server-fuzz/
./result/bin/dcc-fuzz -dict=src/fe-fuzz/dcc-tokens.txt corpus/dcc-fuzz/
# Limit number of runs
./result/bin/irssi-fuzz -runs=10000 corpus/irssi-fuzz/
# Parallel fuzzing (use multiple cores)
./result/bin/server-fuzz -fork=4 -dict=src/fe-fuzz/tokens.txt corpus/server-fuzz/
# Ignore memory leaks to focus on crashes
./result/bin/server-fuzz -detect_leaks=0 corpus/server-fuzz/
Seed Corpus
Initial seed inputs are provided in fuzz-corpora/:
# Copy seeds to corpus directories
mkdir -p corpus/irssi-fuzz corpus/server-fuzz corpus/dcc-fuzz corpus/event-get-params-fuzz corpus/theme-load-fuzz
cp fuzz-corpora/irssi-fuzz/* corpus/irssi-fuzz/
cp fuzz-corpora/server-fuzz/* corpus/server-fuzz/
cp fuzz-corpora/dcc-fuzz/* corpus/dcc-fuzz/
cp fuzz-corpora/event-get-params-fuzz/* corpus/event-get-params-fuzz/
cp fuzz-corpora/theme-load-fuzz/* corpus/theme-load-fuzz/
Reproducing Crashes
When a fuzzer finds a crash, it saves the input to a file:
# Reproduce a crash
./result/bin/server-fuzz crash-<hash>
# Get more details with symbolized stack trace
ASAN_OPTIONS=symbolize=1 ./result/bin/server-fuzz crash-<hash>
Fuzzer Input Formats
- irssi-fuzz: Arbitrary text, may contain irssi format codes (
%B,%U, etc.) - server-fuzz: Byte 0 selects prefix mode, remaining bytes are
\r\n-separated IRC messages - dcc-fuzz: Byte 0 selects DCC type (0=SEND, 1=CHAT, 2=RESUME, 3=ACCEPT, 4=GET cmd, 5=CLOSE cmd, 6=raw), remaining bytes are DCC message content
- event-get-params-fuzz: Byte 0 selects parsing mode (0-7), remaining bytes are parameters
- theme-load-fuzz: irssi theme file format
Continuous Integration
To check that everything builds:
nix flake check
Troubleshooting
UBSan warnings about function pointer types
The warning about signals.c function pointer types is expected:
runtime error: call to function through pointer to incorrect function type
This is due to irssi's dynamic signal dispatch system and is a known pattern in the codebase.
Fuzzer stops immediately
Ensure the corpus directory exists:
mkdir -p corpus/irssi-fuzz
Build fails with "perl not found"
Perl is required even for minimal/fuzzer builds (for generating help files). The Nix flake handles this automatically.