Skip to content

Commit ce5995c

Browse files
committed
Pass length to free flag conditions list callback and remove libc from rust api
Allows language bindings like rust to free conditions lists sanely # Conflicts: # rust/Cargo.lock
1 parent ec43516 commit ce5995c

10 files changed

+29
-36
lines changed

arch/riscv/Cargo.lock

-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

architecture.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ BNFlagConditionForSemanticClass* Architecture::GetFlagConditionsForSemanticFlagG
462462
}
463463

464464

465-
void Architecture::FreeFlagConditionsForSemanticFlagGroupCallback(void*, BNFlagConditionForSemanticClass* conditions)
465+
void Architecture::FreeFlagConditionsForSemanticFlagGroupCallback(void*, BNFlagConditionForSemanticClass* conditions, size_t)
466466
{
467467
delete[] conditions;
468468
}

binaryninjaapi.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -7743,7 +7743,7 @@ namespace BinaryNinja {
77437743
static BNFlagConditionForSemanticClass* GetFlagConditionsForSemanticFlagGroupCallback(
77447744
void* ctxt, uint32_t semGroup, size_t* count);
77457745
static void FreeFlagConditionsForSemanticFlagGroupCallback(
7746-
void* ctxt, BNFlagConditionForSemanticClass* conditions);
7746+
void* ctxt, BNFlagConditionForSemanticClass* conditions, size_t count);
77477747
static uint32_t* GetFlagsWrittenByFlagWriteTypeCallback(void* ctxt, uint32_t writeType, size_t* count);
77487748
static uint32_t GetSemanticClassForFlagWriteTypeCallback(void* ctxt, uint32_t writeType);
77497749
static size_t GetFlagWriteLowLevelILCallback(void* ctxt, BNLowLevelILOperation op, size_t size,

binaryninjacore.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1831,7 +1831,7 @@ extern "C"
18311831
uint32_t* (*getFlagsRequiredForSemanticFlagGroup)(void* ctxt, uint32_t semGroup, size_t* count);
18321832
BNFlagConditionForSemanticClass* (*getFlagConditionsForSemanticFlagGroup)(
18331833
void* ctxt, uint32_t semGroup, size_t* count);
1834-
void (*freeFlagConditionsForSemanticFlagGroup)(void* ctxt, BNFlagConditionForSemanticClass* conditions);
1834+
void (*freeFlagConditionsForSemanticFlagGroup)(void* ctxt, BNFlagConditionForSemanticClass* conditions, size_t count);
18351835
uint32_t* (*getFlagsWrittenByFlagWriteType)(void* ctxt, uint32_t writeType, size_t* count);
18361836
uint32_t (*getSemanticClassForFlagWriteType)(void* ctxt, uint32_t writeType);
18371837
size_t (*getFlagWriteLowLevelIL)(void* ctxt, BNLowLevelILOperation op, size_t size, uint32_t flagWriteType,

python/architecture.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -914,7 +914,7 @@ def _get_flag_conditions_for_semantic_flag_group(self, ctxt, sem_group, count):
914914
count[0] = 0
915915
return None
916916

917-
def _free_flag_conditions_for_semantic_flag_group(self, ctxt, conditions):
917+
def _free_flag_conditions_for_semantic_flag_group(self, ctxt, conditions, count):
918918
try:
919919
buf = ctypes.cast(conditions, ctypes.c_void_p)
920920
if buf.value not in self._pending_condition_lists:

rust/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ noexports = []
1111
[dependencies]
1212
lazy_static = "1.4.0"
1313
log = "0.4"
14-
libc = "0.2"
1514
rayon = { version = "1.8", optional = true }
1615
binaryninjacore-sys = { path = "binaryninjacore-sys" }
1716

rust/src/architecture.rs

+17-21
Original file line numberDiff line numberDiff line change
@@ -1940,7 +1940,7 @@ where
19401940
None => BnString::new("invalid_flag_group").into_raw(),
19411941
}
19421942
}
1943-
1943+
19441944
extern "C" fn cb_registers_full_width<A>(ctxt: *mut c_void, count: *mut usize) -> *mut u32
19451945
where
19461946
A: 'static + Architecture<Handle = CustomArchitectureHandle<A>> + Send + Sync,
@@ -2101,7 +2101,7 @@ where
21012101

21022102
if let Some(group) = custom_arch.flag_group_from_id(group) {
21032103
let mut flags = group.flags_required();
2104-
2104+
21052105
// SAFETY: `count` is an out parameter
21062106
unsafe { *count = flags.len() };
21072107
let regs_ptr = flags.as_mut_ptr();
@@ -2127,23 +2127,13 @@ where
21272127

21282128
if let Some(group) = custom_arch.flag_group_from_id(group) {
21292129
let flag_conditions = group.flag_conditions();
2130+
let mut flags = flag_conditions.values().collect::<Vec<_>>();
21302131

2131-
unsafe {
2132-
let allocation_size =
2133-
mem::size_of::<BNFlagConditionForSemanticClass>() * flag_conditions.len();
2134-
let result = libc::malloc(allocation_size) as *mut BNFlagConditionForSemanticClass;
2135-
let out_slice = slice::from_raw_parts_mut(result, flag_conditions.len());
2136-
2137-
for (i, (class, cond)) in flag_conditions.iter().enumerate() {
2138-
let out = out_slice.get_unchecked_mut(i);
2139-
2140-
out.semanticClass = class.id();
2141-
out.condition = *cond;
2142-
}
2143-
2144-
*count = flag_conditions.len();
2145-
result
2146-
}
2132+
// SAFETY: `count` is an out parameter
2133+
unsafe { *count = flags.len() };
2134+
let regs_ptr = flags.as_mut_ptr();
2135+
mem::forget(flags);
2136+
regs_ptr as *mut _
21472137
} else {
21482138
unsafe {
21492139
*count = 0;
@@ -2155,11 +2145,17 @@ where
21552145
extern "C" fn cb_free_flag_conditions_for_semantic_flag_group<A>(
21562146
_ctxt: *mut c_void,
21572147
conds: *mut BNFlagConditionForSemanticClass,
2148+
count: usize,
21582149
) where
21592150
A: 'static + Architecture<Handle = CustomArchitectureHandle<A>> + Send + Sync,
21602151
{
2152+
if conds.is_null() {
2153+
return;
2154+
}
2155+
21612156
unsafe {
2162-
libc::free(conds as *mut _);
2157+
let regs_ptr = ptr::slice_from_raw_parts_mut(conds, count);
2158+
let _regs = Box::from_raw(regs_ptr);
21632159
}
21642160
}
21652161

@@ -2175,7 +2171,7 @@ where
21752171

21762172
if let Some(write_type) = custom_arch.flag_write_from_id(write_type) {
21772173
let mut written = write_type.flags_written();
2178-
2174+
21792175
// SAFETY: `count` is an out parameter
21802176
unsafe { *count = written.len() };
21812177
let regs_ptr = written.as_mut_ptr();
@@ -2449,7 +2445,7 @@ where
24492445
{
24502446
let custom_arch = unsafe { &*(ctxt as *mut A) };
24512447
let mut intrinsics = custom_arch.intrinsics();
2452-
2448+
24532449
// SAFETY: Passed in to be written
24542450
unsafe { *count = intrinsics.len() };
24552451
let regs_ptr = intrinsics.as_mut_ptr();

rust/src/filemetadata.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
use std::ffi::c_void;
1516
use binaryninjacore_sys::{
1617
BNBeginUndoActions,
1718
BNCloseFile,
@@ -224,7 +225,7 @@ impl FileMetadata {
224225
BNCreateDatabaseWithProgress(
225226
handle,
226227
filename_ptr,
227-
func as *mut libc::c_void,
228+
func as *mut c_void,
228229
Some(cb_progress_func),
229230
ptr::null_mut(),
230231
)
@@ -273,7 +274,7 @@ impl FileMetadata {
273274
BNOpenExistingDatabaseWithProgress(
274275
self.handle,
275276
filename_ptr,
276-
func as *mut libc::c_void,
277+
func as *mut c_void,
277278
Some(cb_progress_func),
278279
)
279280
},

rust/src/interaction.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,15 @@
1616
1717
use binaryninjacore_sys::*;
1818

19-
use std::ffi::CStr;
20-
use std::os::raw::{c_char, c_void};
19+
use std::ffi::{c_char, c_void, CStr};
2120
use std::path::PathBuf;
2221

2322
use crate::binaryview::BinaryView;
2423
use crate::rc::Ref;
2524
use crate::string::{BnStrCompatible, BnString};
2625

2726
pub fn get_text_line_input(prompt: &str, title: &str) -> Option<String> {
28-
let mut value: *mut libc::c_char = std::ptr::null_mut();
27+
let mut value: *mut c_char = std::ptr::null_mut();
2928

3029
let result = unsafe {
3130
BNGetTextLineInput(
@@ -80,7 +79,7 @@ pub fn get_address_input(prompt: &str, title: &str) -> Option<u64> {
8079
}
8180

8281
pub fn get_open_filename_input(prompt: &str, extension: &str) -> Option<PathBuf> {
83-
let mut value: *mut libc::c_char = std::ptr::null_mut();
82+
let mut value: *mut c_char = std::ptr::null_mut();
8483

8584
let result = unsafe {
8685
BNGetOpenFileNameInput(
@@ -98,7 +97,7 @@ pub fn get_open_filename_input(prompt: &str, extension: &str) -> Option<PathBuf>
9897
}
9998

10099
pub fn get_save_filename_input(prompt: &str, title: &str, default_name: &str) -> Option<PathBuf> {
101-
let mut value: *mut libc::c_char = std::ptr::null_mut();
100+
let mut value: *mut c_char = std::ptr::null_mut();
102101

103102
let result = unsafe {
104103
BNGetSaveFileNameInput(
@@ -117,7 +116,7 @@ pub fn get_save_filename_input(prompt: &str, title: &str, default_name: &str) ->
117116
}
118117

119118
pub fn get_directory_name_input(prompt: &str, default_name: &str) -> Option<PathBuf> {
120-
let mut value: *mut libc::c_char = std::ptr::null_mut();
119+
let mut value: *mut c_char = std::ptr::null_mut();
121120

122121
let result = unsafe {
123122
BNGetDirectoryNameInput(

rust/src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@
124124
extern crate log;
125125
#[doc(hidden)]
126126
pub extern crate binaryninjacore_sys;
127-
extern crate libc;
128127
#[cfg(feature = "rayon")]
129128
extern crate rayon;
130129

0 commit comments

Comments
 (0)