Skip to content

Commit b8377ce

Browse files
committed
fixup: don't leak objfile::File instance
1 parent d8d3dc7 commit b8377ce

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

rust-crates/symblib-capi/src/gosym.rs

+20-4
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,23 @@
33

44
use crate::{FfiResult, StatusCode, SymblibPointResolver};
55
use std::ffi::{c_char, CStr};
6+
use std::mem;
67
use std::path::Path;
7-
use symblib::symbconv::PointResolver;
8+
use symblib::symbconv::{PointResolver, ResolvedSymbol, Result as SymconvResult};
89
use symblib::{gosym::GoRuntimeInfo, objfile};
910

1011
pub struct SymblibGoRuntime {
11-
#[allow(dead_code)]
12+
#[allow(unused)]
13+
obj: Box<objfile::File>,
1214
runtime: GoRuntimeInfo<'static>,
1315
}
1416

17+
impl PointResolver for SymblibGoRuntime {
18+
fn symbols_for_pc(&self, pc: symblib::VirtAddr) -> SymconvResult<Vec<ResolvedSymbol>> {
19+
self.runtime.symbols_for_pc(pc)
20+
}
21+
}
22+
1523
#[no_mangle]
1624
pub unsafe extern "C" fn symblib_goruntime_new(
1725
executable: *const c_char,
@@ -32,12 +40,20 @@ unsafe fn goruntime_new_impl(
3240
.map(Path::new)
3341
.map_err(|_| StatusCode::BadUtf8)?;
3442

35-
let obj = Box::leak(Box::new(objfile::File::load(executable)?));
43+
let obj = Box::new(objfile::File::load(executable)?);
3644
let obj_reader = obj.parse()?;
3745
let go_runtime = GoRuntimeInfo::open(&obj_reader)?;
3846

47+
// Transmute away lifetime to allow for self-referential struct.
48+
let go_runtime: GoRuntimeInfo<'static> = mem::transmute(go_runtime);
49+
50+
let resolver = SymblibGoRuntime {
51+
obj,
52+
runtime: go_runtime,
53+
};
54+
3955
let point_resolver = Box::new(SymblibPointResolver::new(
40-
Box::new(go_runtime) as Box<dyn PointResolver + Send>
56+
Box::new(resolver) as Box<dyn PointResolver + Send>
4157
));
4258
*runtime = Box::into_raw(point_resolver);
4359
Ok(())

0 commit comments

Comments
 (0)