Skip to content

Commit cbdaac2

Browse files
committed
fn COVER_ctx_init: make safe
1 parent 15ecf6c commit cbdaac2

File tree

1 file changed

+64
-40
lines changed

1 file changed

+64
-40
lines changed

lib/dictBuilder/cover.rs

Lines changed: 64 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -303,40 +303,48 @@ type __compar_d_fn_t = unsafe extern "C" fn(
303303
*const core::ffi::c_void,
304304
) -> core::ffi::c_int;
305305

306-
unsafe extern "C" fn stableSort(ctx: &mut COVER_ctx_t) {
306+
fn stableSort(ctx: &mut COVER_ctx_t) {
307307
let compare_fn = if ctx.d <= 8 {
308308
COVER_strict_cmp8 as __compar_d_fn_t
309309
} else {
310310
COVER_strict_cmp as __compar_d_fn_t
311311
};
312312

313+
debug_assert_eq!(ctx.suffixSize, ctx.suffix.len());
314+
313315
crate::cfg_select! {
314316
all(not(miri), target_vendor = "apple") => {
315-
qsort_r(
316-
ctx.suffix.as_mut_ptr() as *mut core::ffi::c_void,
317-
ctx.suffixSize,
318-
::core::mem::size_of::<u32>(),
319-
&raw mut *ctx as *mut core::ffi::c_void,
320-
compare_fn,
321-
);
317+
unsafe {
318+
qsort_r(
319+
ctx.suffix.as_mut_ptr() as *mut core::ffi::c_void,
320+
ctx.suffix.len(),
321+
::core::mem::size_of::<u32>(),
322+
&raw mut *ctx as *mut core::ffi::c_void,
323+
compare_fn,
324+
);
325+
}
322326
}
323327
all(not(miri), windows) => {
324-
qsort_s(
325-
ctx.suffix.as_mut_ptr() as *mut core::ffi::c_void,
326-
ctx.suffixSize,
327-
::core::mem::size_of::<u32>(),
328-
compare_fn,
329-
&raw mut *ctx as *mut core::ffi::c_void,
330-
);
328+
unsafe {
329+
qsort_s(
330+
ctx.suffix.as_mut_ptr() as *mut core::ffi::c_void,
331+
ctx.suffix.len(),
332+
::core::mem::size_of::<u32>(),
333+
compare_fn,
334+
&raw mut *ctx as *mut core::ffi::c_void,
335+
);
336+
}
331337
}
332338
all(not(miri), unix) => {
333-
qsort_r(
334-
ctx.suffix.as_mut_ptr() as *mut core::ffi::c_void,
335-
ctx.suffixSize,
336-
::core::mem::size_of::<u32>(),
337-
compare_fn,
338-
&raw mut *ctx as *mut core::ffi::c_void,
339-
);
339+
unsafe {
340+
qsort_r(
341+
ctx.suffix.as_mut_ptr() as *mut core::ffi::c_void,
342+
ctx.suffix.len(),
343+
::core::mem::size_of::<u32>(),
344+
compare_fn,
345+
&raw mut *ctx as *mut core::ffi::c_void,
346+
);
347+
}
340348
}
341349
_ => {
342350
ctx.suffix.sort_by(|lp, rp| {
@@ -505,26 +513,16 @@ unsafe fn COVER_ctx_destroy(ctx: &mut COVER_ctx_t) {
505513
drop(core::mem::take(&mut ctx.offsets));
506514
}
507515

508-
unsafe fn COVER_ctx_init(
509-
ctx: &mut COVER_ctx_t,
510-
samplesBuffer: *const core::ffi::c_void,
511-
samplesSizes: *const size_t,
516+
fn COVER_ctx_init<'a>(
517+
ctx: &'_ mut COVER_ctx_t<'a>,
518+
samples: &'a [u8],
519+
samplesSizes: &'a [size_t],
512520
nbSamples: core::ffi::c_uint,
513521
d: core::ffi::c_uint,
514522
splitPoint: core::ffi::c_double,
515523
displayLevel: core::ffi::c_int,
516524
) -> size_t {
517-
let samplesSizes = if samplesSizes.is_null() || nbSamples == 0 {
518-
&[]
519-
} else {
520-
core::slice::from_raw_parts(samplesSizes, nbSamples as usize)
521-
};
522-
let totalSamplesSize = samplesSizes.iter().sum::<usize>();
523-
let samples = if samplesBuffer.is_null() || totalSamplesSize == 0 {
524-
&[]
525-
} else {
526-
core::slice::from_raw_parts(samplesBuffer.cast::<u8>(), totalSamplesSize)
527-
};
525+
let totalSamplesSize = samples.len();
528526
let nbTrainSamples = if splitPoint < 1.0f64 {
529527
(nbSamples as core::ffi::c_double * splitPoint) as core::ffi::c_uint
530528
} else {
@@ -829,9 +827,22 @@ pub unsafe extern "C" fn ZDICT_trainFromBuffer_cover(
829827
}
830828
return Error::dstSize_tooSmall.to_error_code();
831829
}
830+
831+
let samplesSizes = if samplesSizes.is_null() || nbSamples == 0 {
832+
&[]
833+
} else {
834+
core::slice::from_raw_parts(samplesSizes, nbSamples as usize)
835+
};
836+
let totalSamplesSize = samplesSizes.iter().sum::<usize>();
837+
let samples = if samplesBuffer.is_null() || totalSamplesSize == 0 {
838+
&[]
839+
} else {
840+
core::slice::from_raw_parts(samplesBuffer.cast::<u8>(), totalSamplesSize)
841+
};
842+
832843
let initVal = COVER_ctx_init(
833844
&mut ctx,
834-
samplesBuffer,
845+
samples,
835846
samplesSizes,
836847
nbSamples,
837848
parameters.d,
@@ -870,7 +881,7 @@ pub unsafe extern "C" fn ZDICT_trainFromBuffer_cover(
870881
dict.add(tail) as *const core::ffi::c_void,
871882
dictBufferCapacity.wrapping_sub(tail),
872883
samplesBuffer,
873-
samplesSizes,
884+
samplesSizes.as_ptr(),
874885
nbSamples,
875886
parameters.zParams,
876887
);
@@ -1342,9 +1353,22 @@ pub unsafe extern "C" fn ZDICT_optimizeTrainFromBuffer_cover(
13421353
} else {
13431354
displayLevel - 1
13441355
};
1356+
1357+
let samplesSizes = if samplesSizes.is_null() || nbSamples == 0 {
1358+
&[]
1359+
} else {
1360+
core::slice::from_raw_parts(samplesSizes, nbSamples as usize)
1361+
};
1362+
let totalSamplesSize = samplesSizes.iter().sum::<usize>();
1363+
let samples = if samplesBuffer.is_null() || totalSamplesSize == 0 {
1364+
&[]
1365+
} else {
1366+
core::slice::from_raw_parts(samplesBuffer.cast::<u8>(), totalSamplesSize)
1367+
};
1368+
13451369
let initVal = COVER_ctx_init(
13461370
&mut ctx,
1347-
samplesBuffer,
1371+
samples,
13481372
samplesSizes,
13491373
nbSamples,
13501374
d,

0 commit comments

Comments
 (0)