Skip to content

Commit 909fd41

Browse files
committed
Manually drop osdp_pd_info_t to prevent leaks
1 parent aae2afa commit 909fd41

File tree

3 files changed

+30
-1
lines changed

3 files changed

+30
-1
lines changed

libosdp/src/cp.rs

+3
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ where
5757

5858
fn cp_setup(info: Vec<libosdp_sys::osdp_pd_info_t>) -> Result<*mut c_void> {
5959
let ctx = unsafe { libosdp_sys::osdp_cp_setup(info.len() as i32, info.as_ptr()) };
60+
for pd in info.into_iter() {
61+
crate::drop_osdp_pd_info(pd);
62+
}
6063
if ctx.is_null() {
6164
Err(OsdpError::Setup)
6265
} else {

libosdp/src/pd.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ where
5858
}
5959

6060
fn pd_setup(mut info: PdInfo) -> Result<*mut c_void> {
61-
let ctx = unsafe { libosdp_sys::osdp_pd_setup(&info.as_struct()) };
61+
let info_struct = info.as_struct();
62+
let ctx = unsafe { libosdp_sys::osdp_pd_setup(&info_struct) };
63+
crate::drop_osdp_pd_info(info_struct);
6264
if ctx.is_null() {
6365
Err(OsdpError::Setup)
6466
} else {

libosdp/src/pdinfo.rs

+24
Original file line numberDiff line numberDiff line change
@@ -279,3 +279,27 @@ impl PdInfo {
279279
}
280280
}
281281
}
282+
283+
pub(crate) fn drop_osdp_pd_info(info: libosdp_sys::osdp_pd_info_t) {
284+
unsafe {
285+
// The name is not copied by LibOSDP, so we cannot drop it here
286+
// if !info.name.is_null() {
287+
// drop(CString::from_raw(info.name as *mut _));
288+
// }
289+
if !info.cap.is_null() {
290+
let mut cap = info.cap as *mut libosdp_sys::osdp_pd_cap;
291+
while (*cap).function_code != -1i8 as u8 {
292+
cap = cap.add(1);
293+
}
294+
let len = (cap.offset_from(info.cap) + 1) as usize;
295+
drop(Vec::from_raw_parts(
296+
info.cap as *mut libosdp_sys::osdp_pd_cap,
297+
len,
298+
len,
299+
));
300+
}
301+
if !info.scbk.is_null() {
302+
drop(Box::from_raw(info.scbk as *mut [u8; 16]));
303+
}
304+
}
305+
}

0 commit comments

Comments
 (0)