Files
bun.sh/src/cli/fuzzilli_command.zig
Marko Vejnovic 67be07fca4 Fix fuzzilli_command.zig (#24941)
### What does this PR do?

Needed to fix `fuzzilli_command.zig` to get it to build

### How did you verify your code works?
2025-11-23 00:34:27 -08:00

75 lines
2.7 KiB
Zig

pub const FuzzilliCommand = if (bun.Environment.enable_fuzzilli) struct {
pub fn exec(ctx: Command.Context) !void {
@branchHint(.cold);
if (!Environment.isPosix) {
Output.prettyErrorln("<r><red>error<r>: Fuzzilli mode is only supported on POSIX systems", .{});
Global.exit(1);
}
// Set an environment variable so we can detect fuzzilli mode in JavaScript
// Verify REPRL file descriptors are available
const REPRL_CRFD: c_int = 100;
verifyFd(REPRL_CRFD) catch {
Output.prettyErrorln("<r><red>error<r>: REPRL_CRFD (fd {d}) is not available. Run Bun under Fuzzilli.", .{REPRL_CRFD});
Output.prettyErrorln("<r><d>Example: fuzzilli --profile=bun /path/to/bun fuzzilli<r>", .{});
Global.exit(1);
};
// Always embed the REPRL script (it's small and not worth the runtime overhead)
const reprl_script = @embedFile("../js/eval/fuzzilli-reprl.ts");
// Open /tmp directory
const temp_dir_fd = switch (bun.sys.open("/tmp", bun.O.DIRECTORY | bun.O.RDONLY, 0)) {
.result => |fd| fd,
.err => {
Output.prettyErrorln("<r><red>error<r>: Could not access /tmp directory", .{});
Global.exit(1);
},
};
defer temp_dir_fd.close();
// Create temp file for the script
const temp_file_name = "bun-fuzzilli-reprl.js";
const temp_file_fd = switch (bun.sys.openat(temp_dir_fd, temp_file_name, bun.O.CREAT | bun.O.WRONLY | bun.O.TRUNC, 0o644)) {
.result => |fd| fd,
.err => {
Output.prettyErrorln("<r><red>error<r>: Could not create temp file", .{});
Global.exit(1);
},
};
defer temp_file_fd.close();
// Write the script to the temp file
switch (bun.sys.write(temp_file_fd, reprl_script)) {
.err => {
Output.prettyErrorln("<r><red>error<r>: Could not write temp file", .{});
Global.exit(1);
},
.result => {},
}
Output.prettyErrorln("<r><d>[FUZZILLI] Temp file written, booting JS runtime<r>", .{});
// Run the temp file
const temp_path = "/tmp/bun-fuzzilli-reprl.js";
try Run.boot(ctx, temp_path, null);
}
fn verifyFd(fd: c_int) !void {
const stat = try std_posix.fstat(fd);
_ = stat;
}
} else {};
const bun = @import("bun");
const Environment = bun.Environment;
const Global = bun.Global;
const Output = bun.Output;
const Command = bun.cli.Command;
const Run = bun.bun_js.Run;
const std = @import("std");
const std_posix = std.posix;