Skip to content

Commit f741ac9

Browse files
committed
More rust cleanup
- Fixed progress executor freeing itself after one iteration - Updated the last of the doc imports - Moved mainthread to main_thread - Made project creation and opening failable We could probably AsRef<ProgressExecutor> to get around the allocation and free inside the function bodies, not high priority as those functions are long running anyways.
1 parent 90e925a commit f741ac9

File tree

19 files changed

+138
-75
lines changed

19 files changed

+138
-75
lines changed

rust/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ To specify a specific commit see the cargo documentation [here](https://doc.rust
1818

1919
```rust
2020
use binaryninja::headless::Session;
21-
use binaryninja::binaryview::{BinaryViewBase, BinaryViewExt};
21+
use binaryninja::binary_view::{BinaryViewBase, BinaryViewExt};
2222

2323
fn main() {
2424
let headless_session = Session::new().expect("Failed to initialize session");

rust/src/binary_view.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ use crate::types::{
5656
use crate::variable::DataVariable;
5757
use crate::Endianness;
5858
use std::collections::HashMap;
59-
use std::ffi::c_char;
59+
use std::ffi::{c_char, c_void};
6060
use std::ops::Range;
6161
use std::path::Path;
6262
use std::ptr::NonNull;
@@ -645,17 +645,20 @@ pub trait BinaryViewExt: BinaryViewBase {
645645
.collect();
646646
let mut result_ids: *mut *mut c_char = std::ptr::null_mut();
647647
let mut result_names: *mut BNQualifiedName = std::ptr::null_mut();
648+
let boxed_progress = Box::new(progress.into());
649+
let leaked_boxed_progress = Box::into_raw(boxed_progress);
648650
let result_count = unsafe {
649651
BNDefineAnalysisTypes(
650652
self.as_ref().handle,
651653
types.as_mut_ptr(),
652654
types.len(),
653655
Some(ProgressExecutor::cb_execute),
654-
progress.into().into_raw_context(),
656+
leaked_boxed_progress as *mut c_void,
655657
&mut result_ids as *mut _,
656658
&mut result_names as *mut _,
657659
)
658660
};
661+
let _ = unsafe { Box::from_raw(leaked_boxed_progress) };
659662

660663
for ty in types {
661664
QualifiedNameTypeAndId::free_raw(ty);
@@ -690,15 +693,18 @@ pub trait BinaryViewExt: BinaryViewBase {
690693
.map(Into::into)
691694
.map(QualifiedNameAndType::into_raw)
692695
.collect();
696+
let boxed_progress = Box::new(progress.into());
697+
let leaked_boxed_progress = Box::into_raw(boxed_progress);
693698
unsafe {
694699
BNDefineUserAnalysisTypes(
695700
self.as_ref().handle,
696701
types.as_mut_ptr(),
697702
types.len(),
698703
Some(ProgressExecutor::cb_execute),
699-
progress.into().into_raw_context(),
704+
leaked_boxed_progress as *mut c_void,
700705
)
701706
};
707+
let _ = unsafe { Box::from_raw(leaked_boxed_progress) };
702708
for ty in types {
703709
QualifiedNameAndType::free_raw(ty);
704710
}

rust/src/database.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ pub mod undo;
44

55
use binaryninjacore_sys::*;
66
use std::collections::HashMap;
7-
use std::ffi::c_char;
7+
use std::ffi::{c_char, c_void};
88
use std::fmt::Debug;
99
use std::ptr::NonNull;
1010

@@ -94,6 +94,8 @@ impl Database {
9494
{
9595
let name_raw = name.into_bytes_with_nul();
9696
let name_ptr = name_raw.as_ref().as_ptr() as *const c_char;
97+
let boxed_progress = Box::new(progress.into());
98+
let leaked_boxed_progress = Box::into_raw(boxed_progress);
9799
let new_id = unsafe {
98100
BNWriteDatabaseSnapshotData(
99101
self.handle.as_ptr(),
@@ -104,10 +106,11 @@ impl Database {
104106
name_ptr,
105107
data.handle.as_ptr(),
106108
auto_save,
107-
progress.into().into_raw_context(),
109+
leaked_boxed_progress as *mut c_void,
108110
Some(ProgressExecutor::cb_execute),
109111
)
110112
};
113+
let _ = unsafe { Box::from_raw(leaked_boxed_progress) };
111114
SnapshotId(new_id)
112115
}
113116

rust/src/database/snapshot.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use binaryninjacore_sys::{
1414
BNSnapshot, BNSnapshotHasAncestor, BNSnapshotHasContents, BNSnapshotHasUndo,
1515
BNSnapshotStoreData,
1616
};
17-
use std::ffi::c_char;
17+
use std::ffi::{c_char, c_void};
1818
use std::fmt;
1919
use std::fmt::{Debug, Display, Formatter};
2020
use std::ptr::NonNull;
@@ -136,14 +136,17 @@ impl Snapshot {
136136
) -> Array<UndoEntry> {
137137
assert!(self.has_undo());
138138
let mut count = 0;
139+
let boxed_progress = Box::new(progress.into());
140+
let leaked_boxed_progress = Box::into_raw(boxed_progress);
139141
let result = unsafe {
140142
BNGetSnapshotUndoEntriesWithProgress(
141143
self.handle.as_ptr(),
142-
progress.into().into_raw_context(),
144+
leaked_boxed_progress as *mut c_void,
143145
Some(ProgressExecutor::cb_execute),
144146
&mut count,
145147
)
146148
};
149+
let _ = unsafe { Box::from_raw(leaked_boxed_progress) };
147150
assert!(!result.is_null());
148151
unsafe { Array::new(result, count, ()) }
149152
}
@@ -158,13 +161,16 @@ impl Snapshot {
158161
&self,
159162
progress: impl Into<ProgressExecutor>,
160163
) -> Ref<KeyValueStore> {
164+
let boxed_progress = Box::new(progress.into());
165+
let leaked_boxed_progress = Box::into_raw(boxed_progress);
161166
let result = unsafe {
162167
BNReadSnapshotDataWithProgress(
163168
self.handle.as_ptr(),
164-
progress.into().into_raw_context(),
169+
leaked_boxed_progress as *mut c_void,
165170
Some(ProgressExecutor::cb_execute),
166171
)
167172
};
173+
let _ = unsafe { Box::from_raw(leaked_boxed_progress) };
168174
unsafe { KeyValueStore::ref_from_raw(NonNull::new(result).unwrap()) }
169175
}
170176

@@ -190,14 +196,18 @@ impl Snapshot {
190196
data: &KeyValueStore,
191197
progress: impl Into<ProgressExecutor>,
192198
) -> bool {
193-
unsafe {
199+
let boxed_progress = Box::new(progress.into());
200+
let leaked_boxed_progress = Box::into_raw(boxed_progress);
201+
let success = unsafe {
194202
BNSnapshotStoreData(
195203
self.handle.as_ptr(),
196204
data.handle.as_ptr(),
197-
progress.into().into_raw_context(),
205+
leaked_boxed_progress as *mut c_void,
198206
Some(ProgressExecutor::cb_execute),
199207
)
200-
}
208+
};
209+
let _ = unsafe { Box::from_raw(leaked_boxed_progress) };
210+
success
201211
}
202212

203213
/// Determine if this snapshot has another as an ancestor

rust/src/debuginfo.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ impl DebugInfoParser {
177177
existing_debug_info: Option<&DebugInfo>,
178178
progress: impl Into<ProgressExecutor>,
179179
) -> Option<Ref<DebugInfo>> {
180+
let boxed_progress = Box::new(progress.into());
181+
let leaked_boxed_progress = Box::into_raw(boxed_progress);
180182
let info: *mut BNDebugInfo = match existing_debug_info {
181183
Some(debug_info) => unsafe {
182184
BNParseDebugInfo(
@@ -185,7 +187,7 @@ impl DebugInfoParser {
185187
debug_file.handle,
186188
debug_info.handle,
187189
Some(ProgressExecutor::cb_execute),
188-
progress.into().into_raw_context(),
190+
leaked_boxed_progress as *mut c_void,
189191
)
190192
},
191193
None => unsafe {
@@ -195,10 +197,11 @@ impl DebugInfoParser {
195197
debug_file.handle,
196198
std::ptr::null_mut(),
197199
Some(ProgressExecutor::cb_execute),
198-
progress.into().into_raw_context(),
200+
leaked_boxed_progress as *mut c_void,
199201
)
200202
},
201203
};
204+
let _ = unsafe { Box::from_raw(leaked_boxed_progress) };
202205
if info.is_null() {
203206
return None;
204207
}

rust/src/file_metadata.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use binaryninjacore_sys::{
2424
BNSaveAutoSnapshot, BNSetFilename, BNUndo,
2525
};
2626
use binaryninjacore_sys::{BNCreateDatabaseWithProgress, BNOpenExistingDatabaseWithProgress};
27+
use std::ffi::c_void;
2728
use std::fmt::Debug;
2829

2930
use crate::rc::*;
@@ -226,15 +227,19 @@ impl FileMetadata {
226227
return false;
227228
};
228229

229-
unsafe {
230+
let boxed_progress = Box::new(progress.into());
231+
let leaked_boxed_progress = Box::into_raw(boxed_progress);
232+
let success = unsafe {
230233
BNCreateDatabaseWithProgress(
231234
raw_view.handle,
232235
filename_ptr,
233-
progress.into().into_raw_context(),
236+
leaked_boxed_progress as *mut c_void,
234237
Some(ProgressExecutor::cb_execute),
235238
ptr::null_mut(),
236239
)
237-
}
240+
};
241+
let _ = unsafe { Box::from_raw(leaked_boxed_progress) };
242+
success
238243
}
239244

240245
pub fn save_auto_snapshot(&self) -> bool {
@@ -283,15 +288,17 @@ impl FileMetadata {
283288
) -> Result<Ref<BinaryView>, ()> {
284289
let filename = filename.into_bytes_with_nul();
285290
let filename_ptr = filename.as_ref().as_ptr() as *mut _;
286-
291+
let boxed_progress = Box::new(progress.into());
292+
let leaked_boxed_progress = Box::into_raw(boxed_progress);
287293
let view = unsafe {
288294
BNOpenExistingDatabaseWithProgress(
289295
self.handle,
290296
filename_ptr,
291-
progress.into().into_raw_context(),
297+
leaked_boxed_progress as *mut c_void,
292298
Some(ProgressExecutor::cb_execute),
293299
)
294300
};
301+
let _ = unsafe { Box::from_raw(leaked_boxed_progress) };
295302

296303
if view.is_null() {
297304
Err(())

rust/src/headless.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use std::path::{Path, PathBuf};
2121
use thiserror::Error;
2222

2323
use crate::enterprise::release_license;
24-
use crate::mainthread::{MainThreadAction, MainThreadHandler};
24+
use crate::main_thread::{MainThreadAction, MainThreadHandler};
2525
use crate::rc::Ref;
2626
use binaryninjacore_sys::{BNInitPlugins, BNInitRepoPlugins};
2727
use std::sync::mpsc::Sender;

rust/src/lib.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,11 @@ pub mod interaction;
7373
pub mod linear_view;
7474
pub mod logger;
7575
pub mod low_level_il;
76-
pub mod mainthread;
76+
pub mod main_thread;
7777
pub mod medium_level_il;
7878
pub mod metadata;
7979
pub mod platform;
80-
mod progress;
80+
pub mod progress;
8181
pub mod project;
8282
pub mod rc;
8383
pub mod references;
@@ -134,15 +134,18 @@ pub fn load_with_progress(
134134
) -> Option<Ref<BinaryView>> {
135135
let file_path = file_path.as_ref().into_bytes_with_nul();
136136
let options = c"";
137+
let boxed_progress = Box::new(progress.into());
138+
let leaked_boxed_progress = Box::into_raw(boxed_progress);
137139
let handle = unsafe {
138140
BNLoadFilename(
139141
file_path.as_ptr() as *mut _,
140142
true,
141143
options.as_ptr() as *mut c_char,
142144
Some(ProgressExecutor::cb_execute),
143-
progress.into().into_raw_context(),
145+
leaked_boxed_progress as *mut c_void,
144146
)
145147
};
148+
let _ = unsafe { Box::from_raw(leaked_boxed_progress) };
146149
if handle.is_null() {
147150
None
148151
} else {
@@ -206,16 +209,18 @@ where
206209
.as_ref()
207210
.to_vec()
208211
};
209-
212+
let boxed_progress = Box::new(progress.into());
213+
let leaked_boxed_progress = Box::into_raw(boxed_progress);
210214
let handle = unsafe {
211215
BNLoadFilename(
212216
file_path.as_ptr() as *mut _,
213217
update_analysis_and_wait,
214218
options_or_default.as_ptr() as *mut c_char,
215219
Some(ProgressExecutor::cb_execute),
216-
progress.into().into_raw_context(),
220+
leaked_boxed_progress as *mut c_void,
217221
)
218222
};
223+
let _ = unsafe { Box::from_raw(leaked_boxed_progress) };
219224

220225
if handle.is_null() {
221226
None
@@ -262,16 +267,18 @@ where
262267
.as_ref()
263268
.to_vec()
264269
};
265-
270+
let boxed_progress = Box::new(progress.into());
271+
let leaked_boxed_progress = Box::into_raw(boxed_progress);
266272
let handle = unsafe {
267273
BNLoadBinaryView(
268274
bv.handle as *mut _,
269275
update_analysis_and_wait,
270276
options_or_default.as_ptr() as *mut c_char,
271277
Some(ProgressExecutor::cb_execute),
272-
progress.into().into_raw_context(),
278+
leaked_boxed_progress as *mut c_void,
273279
)
274280
};
281+
let _ = unsafe { Box::from_raw(leaked_boxed_progress) };
275282

276283
if handle.is_null() {
277284
None
File renamed without changes.

rust/src/medium_level_il/function.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ impl MediumLevelILFunction {
187187
///
188188
/// # Example
189189
/// ```no_run
190-
/// # use binaryninja::mlil::MediumLevelILFunction;
190+
/// # use binaryninja::medium_level_il::MediumLevelILFunction;
191191
/// # use binaryninja::variable::PossibleValueSet;
192192
/// # let mlil_fun: MediumLevelILFunction = todo!();
193193
/// let user_var_val = mlil_fun.user_var_values().iter().next().unwrap();
@@ -322,7 +322,7 @@ impl MediumLevelILFunction {
322322
///
323323
/// # Example
324324
/// ```no_run
325-
/// # use binaryninja::mlil::MediumLevelILFunction;
325+
/// # use binaryninja::medium_level_il::MediumLevelILFunction;
326326
/// # use binaryninja::variable::Variable;
327327
/// # let mlil_fun: MediumLevelILFunction = todo!();
328328
/// # let mlil_var: Variable = todo!();

0 commit comments

Comments
 (0)