fix: C action buffer lengths, byte-faithful callbacks, runtime finalize
Resolves the 8 gaps in docs/rewrite/notes/review-rv10-codex.md (final-Z13.md): - P1 memory safety: the C key-table action (and hovered-link/open-URL payloads) could advertise a length larger than the NUL-truncated allocation. A counted_bytes helper now passes the full bytes plus a trailing NUL with len == byte count, like Zig's backing slices; all C pointer+len structs were audited and tested to read exactly len. - ghostty-bench args follow cli/args.zig (ordered duplicates, empty value resets, first bad value errors, parseBool spellings); the C benchmark tokenizer uses the ArgIteratorGeneral port. - OSC 7 derived titles, desktop notifications and OSC 8 hover links forward raw bytes to the runtime; GTK converts only for display. - C diagnostic getter exports original bytes; escaped surrogates report Utf8CannotEncodeSurrogateHalf; config float formatters print `nan`. - Config::finalize_for(AppRuntime): GTK-only finalization (gtk-single- instance=detect) and termio's cgroup hooks apply only to the GTK runtime, so libghostty keeps `detect` like Zig. Test Plan: - cargo test --workspace --no-fail-fast (exit 0) - cargo test -p ghostty-lib --features test-platform - just check-wasm (macOS/Windows clippy re-run after the concurrent terminal changes land)
This commit is contained in:
1 parent
95fe02b55a
commit
f2ccb04aa4
21 files changed
+479
-133
No files matched your search
@@ -1066,6 +1066,7 @@ impl Subprocess {
|
||||
let pre_info = self.rt_pre_exec_info;
|
||||
let post_info = self.rt_post_fork_info;
|
||||
let create_scope = self.create_scope.clone();
|
||||
let gtk = ghostty_config::config::app_runtime() == ghostty_config::config::AppRuntime::Gtk;
|
||||
let mut cmd = Command {
|
||||
path: self.args[0].clone(),
|
||||
args: self.args.clone(),
|
||||
@@ -1081,15 +1082,19 @@ impl Subprocess {
|
||||
let _ = pty::child_pre_exec(master_raw, slave_raw);
|
||||
None
|
||||
})),
|
||||
rt_pre_exec: Some(Box::new(move || linux_cgroup_pre_exec(&pre_info))),
|
||||
rt_post_fork: Some(Box::new(move |c: &Command| {
|
||||
let create = |pid, mem, tasks| match &create_scope {
|
||||
Some(f) => f(pid, mem, tasks),
|
||||
None => None,
|
||||
};
|
||||
linux_cgroup_post_fork(c, &post_info, create)
|
||||
.map_err(|_: PostForkError| PostForkError)
|
||||
})),
|
||||
// Zig installs these only when the apprt declares them
|
||||
// (`@hasDecl(apprt.runtime, "pre_exec")`): GTK.
|
||||
rt_pre_exec: gtk.then(|| Box::new(move || linux_cgroup_pre_exec(&pre_info)) as Box<_>),
|
||||
rt_post_fork: gtk.then(|| {
|
||||
Box::new(move |c: &Command| {
|
||||
let create = |pid, mem, tasks| match &create_scope {
|
||||
Some(f) => f(pid, mem, tasks),
|
||||
None => None,
|
||||
};
|
||||
linux_cgroup_post_fork(c, &post_info, create)
|
||||
.map_err(|_: PostForkError| PostForkError)
|
||||
}) as Box<_>
|
||||
}),
|
||||
pid: None,
|
||||
};
|
||||
|
||||
|
||||
Reference in new issue
Block a user