{"id":"RUSTSEC-2026-0302","aliases":[],"status":"published","title":"`stack-graphs` C API exports are safe `extern \"C\"` functions","description":"`stack_graphs::c` is a public module. From 0.0.3 through the current crates.io release 0.14.1, its pointer-taking entry points are `pub extern \"C\" fn` rather than `unsafe fn`. Safe Rust can call them.\n\n`sg_stack_graph_free` frees the pointer with `Box::from_raw`. `sg_stack_graph_free(std::ptr::null_mut())` is immediate undefined behavior. The same shape is used by the other `*_free` exports and by getters and mutators that dereference the caller-supplied pointer or pass it to `from_raw_parts` (`sg_stack_graph_nodes`, `sg_stack_graph_add_edges`, and the rest of the pointer-taking functions in `src/c.rs`). Constructors that take no pointer are not part of this issue.\n\nThe upstream repository is archived, so a fix cannot be filed there and no patched release exists. The soundness fix is to make every pointer-taking export `unsafe extern \"C\" fn`, with a safety comment that the pointer is non-null and, for `free`, came from the matching constructor.","facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":false},"published":"2026-09-22T12:00:00Z","modified":"2026-09-22T21:00:02Z","affected":[{"source":"osv","ecosystem":"crates.io","package":"stack-graphs","ranges":[{"type":"SEMVER","events":[{"introduced":"0.0.3-0"}]}]}],"references":[{"url":"https://crates.io/crates/stack-graphs","tags":["package"]},{"url":"https://rustsec.org/advisories/RUSTSEC-2026-0302.html","tags":["advisory"]},{"url":"https://github.com/rustsec/advisory-db/issues/3241","tags":["report"]},{"url":"https://github.com/github/stack-graphs","tags":["web"]}],"sources":{"osv":[{"id":"RUSTSEC-2026-0302","title":"`stack-graphs` C API exports are safe `extern \"C\"` functions","description":"`stack_graphs::c` is a public module. From 0.0.3 through the current crates.io release 0.14.1, its pointer-taking entry points are `pub extern \"C\" fn` rather than `unsafe fn`. Safe Rust can call them.\n\n`sg_stack_graph_free` frees the pointer with `Box::from_raw`. `sg_stack_graph_free(std::ptr::null_mut())` is immediate undefined behavior. The same shape is used by the other `*_free` exports and by getters and mutators that dereference the caller-supplied pointer or pass it to `from_raw_parts` (`sg_stack_graph_nodes`, `sg_stack_graph_add_edges`, and the rest of the pointer-taking functions in `src/c.rs`). Constructors that take no pointer are not part of this issue.\n\nThe upstream repository is archived, so a fix cannot be filed there and no patched release exists. The soundness fix is to make every pointer-taking export `unsafe extern \"C\" fn`, with a safety comment that the pointer is non-null and, for `free`, came from the matching constructor.","status":"published","published":"2026-09-22T12:00:00Z","modified":"2026-09-22T21:00:02.879515742Z","updated_at":"2026-11-02T15:53:40.430679Z"}]}}
