Files
ghostty/test/fuzz-libghostty/src/fuzz_osc.zig
2026-03-03 08:37:45 -08:00

46 lines
1.2 KiB
Zig

const std = @import("std");
const ghostty_vt = @import("ghostty-vt");
const mem = @import("mem.zig");
const osc = ghostty_vt.osc;
/// Use a single global allocator for simplicity and to avoid heap
/// allocation overhead in the fuzzer. The allocator is backed by a fixed
/// buffer, and every fuzz input resets the bump pointer to the start.
var fuzz_alloc: mem.FuzzAllocator(8 * 1024 * 1024) = .{};
pub export fn zig_fuzz_init() callconv(.c) void {
fuzz_alloc.init();
}
pub export fn zig_fuzz_test(
buf: [*]const u8,
len: usize,
) callconv(.c) void {
// Need at least one byte for the terminator selector.
if (len == 0) return;
fuzz_alloc.reset();
const alloc = fuzz_alloc.allocator();
const input = buf[0..len];
// Use the first byte to select the terminator variant.
const selector = input[0];
const payload = input[1..];
var p = osc.Parser.init(alloc);
defer p.deinit();
for (payload) |byte| p.next(byte);
// Exercise all three terminator paths:
// 0 -> BEL (0x07)
// 1 -> ST (0x9c)
// 2 -> missing terminator (null)
const terminator: ?u8 = switch (selector % 3) {
0 => 0x07,
1 => 0x9c,
else => null,
};
_ = p.end(terminator);
}