Skip to content

Commit 5d4b0ea

Browse files
committed
apply Ord::max to addedLength when it would otherwise be zero
1 parent ee6d3a5 commit 5d4b0ea

File tree

2 files changed

+90
-5
lines changed

2 files changed

+90
-5
lines changed

lib/dictBuilder/zdict.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -413,10 +413,7 @@ fn ZDICT_tryMerge(
413413
/* tail overlap */
414414
let mut u = 1usize;
415415
while u < tableSize as usize {
416-
if (u as u32 != eltNbToSkip)
417-
&& table[u].pos > elt.pos
418-
&& table[u].pos <= eltEnd
419-
{
416+
if (u as u32 != eltNbToSkip) && table[u].pos > elt.pos && table[u].pos <= eltEnd {
420417
/* append */
421418
let addedLength = table[u].pos - elt.pos;
422419
table[u].length += addedLength;
@@ -470,7 +467,7 @@ fn ZDICT_tryMerge(
470467
&buf[elt.pos as usize + 1..],
471468
table[u].length as usize,
472469
) {
473-
let addedLength = elt.length.checked_sub(table[u].length).unwrap_or(1);
470+
let addedLength = Ord::max(1, elt.length.checked_sub(table[u].length).unwrap_or(1));
474471
table[u].pos = elt.pos;
475472
table[u].savings += elt.savings * addedLength / elt.length;
476473
table[u].length = Ord::min(elt.length, table[u].length + 1);

test-libzstd-rs-sys/src/dict_builder.rs

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,94 @@ fn test_train_from_buffer_legacy_try_merge_2() {
472472
});
473473
}
474474

475+
#[test]
476+
#[cfg(not(target_family = "wasm"))]
477+
#[cfg_attr(miri, ignore = "slow")]
478+
fn test_train_from_buffer_legacy_try_merge_3() {
479+
let _ = assert_eq_rs_c!({
480+
let mut sample_data: Vec<u8> = vec![
481+
31, 31, 19, 255, 255, 19, 41, 43, 255, 255, 255, 255, 255, 255, 255, 19, 255, 255, 46,
482+
255, 255, 255, 255, 31, 255, 255, 19, 255, 19, 255, 19, 255, 127, 19, 255, 19, 255,
483+
255, 31, 255, 255, 19, 19, 255, 19, 255, 19, 247, 19, 255, 19, 255, 19, 19, 255, 19,
484+
255, 19, 255, 19, 255, 14, 255, 19, 19, 255, 19, 255, 19, 255, 19, 239, 19, 255, 19,
485+
255, 19, 255, 31, 31, 19, 255, 255, 19, 41, 43, 255, 255, 255, 255, 255, 255, 255, 19,
486+
255, 255, 46, 255, 255, 255, 255, 31, 255, 255, 19, 255, 19, 255, 19, 255, 127, 19,
487+
255, 19, 255, 255, 31, 255, 255, 19, 19, 255, 19, 255, 19, 247, 19, 255, 19, 255, 19,
488+
19, 255, 19, 255, 19, 255, 19, 255, 14, 255, 19, 19, 255, 19, 255, 19, 255, 19, 239,
489+
19, 255, 19, 255, 19, 255, 31, 31, 19, 255, 255, 19, 41, 43, 255, 255, 255, 255, 255,
490+
255, 255, 19, 255, 255, 46, 255, 255, 255, 255, 31, 255, 255, 19, 255, 19, 255, 19,
491+
255, 127, 19, 255, 19, 255, 255, 31, 255, 255, 19, 19, 255, 19, 255, 19, 247, 19, 255,
492+
19, 255, 19, 19, 255, 19, 255, 19, 255, 19, 255, 14, 255, 19, 19, 255, 19, 255, 19,
493+
255, 19, 239, 19, 255, 19, 255, 19, 255, 31, 19, 255, 255, 19, 41, 43, 255, 255, 255,
494+
255, 255, 255, 255, 19, 255, 255, 46, 255, 255, 255, 255, 31, 255, 255, 19, 255, 19,
495+
255, 19, 255, 127, 19, 255, 19, 255, 255, 31, 255, 255, 19, 19, 255, 19, 255, 19, 247,
496+
19, 255, 19, 255, 19, 19, 255, 19, 255, 19, 255, 19, 255, 14, 255, 19, 19, 255, 19,
497+
255, 19, 255, 19, 239, 19, 255, 19, 255, 19, 255, 31, 31, 19, 255, 255, 19, 41, 43,
498+
255, 255, 255, 255, 255, 255, 255, 19, 255, 255, 46, 255, 255, 255, 255, 31, 255, 255,
499+
19, 255, 19, 255, 19, 255, 127, 19, 255, 19, 255, 255, 31, 255, 255, 19, 19, 255, 19,
500+
255, 19, 247, 19, 255, 19, 255, 19, 19, 255, 19, 255, 19, 255, 19, 255, 14, 255, 19,
501+
19, 255, 19, 255, 19, 255, 19, 239, 19, 255, 19, 255, 19, 255, 31, 19, 255, 255, 19,
502+
41, 43, 255, 255, 255, 255, 255, 255, 255, 19, 255, 255, 46, 255, 255, 255, 255, 31,
503+
255, 255, 19, 255, 19, 255, 19, 255, 127, 19, 255, 19, 255, 255, 31, 255, 255, 19, 19,
504+
255, 19, 255, 19, 247, 19, 255, 19, 255, 19, 19, 255, 19, 255, 19, 255, 19, 255, 14,
505+
255, 19, 19, 255, 19, 255, 19, 255, 19, 239, 19, 255, 19, 255, 19, 255, 19, 19, 255,
506+
19, 255, 19, 255, 19, 255, 14, 255, 19, 19, 255, 19, 255, 19, 255, 19, 239, 19, 255,
507+
19, 255, 19, 255, 31, 31, 19, 255, 255, 19, 41, 43, 255, 255, 255, 255, 255, 255, 255,
508+
19, 255, 255, 46, 255, 255, 255, 255, 31, 255, 255, 19, 255, 19, 255, 19, 255, 127, 19,
509+
255, 19, 255, 255, 31, 255, 255, 19, 19, 255, 19, 255, 19, 247, 19, 255, 19, 255, 19,
510+
19, 255, 19, 255, 19, 255, 19, 255, 14, 255, 19, 19, 255, 19, 255, 19, 255, 19, 239,
511+
19, 255, 19, 255, 19, 255, 31, 31, 19, 255, 255, 19, 41, 43, 255, 255, 255, 255, 255,
512+
255, 255, 19, 255, 255, 46, 255, 255, 255, 255, 31, 255, 255, 19, 255, 19, 255, 19,
513+
255, 127, 19, 255, 19, 255, 255, 31, 255, 255, 19, 19, 255, 19, 255, 19, 247, 19, 255,
514+
19, 255, 19, 19, 255, 19, 255, 19, 255, 19, 255, 14, 255, 19, 19, 255, 19, 255, 19,
515+
255, 19, 239, 19, 255, 19, 255, 19, 255, 31, 31, 19, 255, 255, 19, 41, 43, 255, 255,
516+
255, 255, 255, 255, 255, 19, 255, 255, 46, 255, 255, 255, 255, 31, 255, 255, 19, 255,
517+
19, 255, 19, 255, 127, 19, 255, 19, 255, 255, 31, 255, 255, 19, 19, 255, 19, 255, 19,
518+
247, 19, 255, 19, 255, 19, 19, 255, 19, 255, 19, 255, 19, 255, 14, 255, 19, 19, 255,
519+
19, 255, 19, 255, 19, 239, 19, 255, 19, 255, 19, 255, 31, 31, 19, 255, 255, 19, 41, 43,
520+
255, 255, 255, 255, 255, 255, 255, 19, 255, 255, 46, 255, 255, 255, 255, 31, 255, 255,
521+
19, 255, 19, 255, 19, 255, 127, 19, 255, 19, 255, 255, 31, 255, 255, 19, 19, 255, 19,
522+
255, 19, 247, 19, 255, 19, 255, 19, 19, 255, 19, 255, 19, 255, 19, 255, 14, 255, 19,
523+
19, 255, 19, 255, 19, 255, 19, 239, 19, 255, 19, 255, 19, 255,
524+
];
525+
526+
let sample_sizes = vec![78, 78, 78, 77, 78, 77, 26, 78, 78, 78, 78];
527+
528+
sample_data.resize(sample_sizes.iter().sum::<usize>(), 0u8);
529+
530+
let params = ZDICT_legacy_params_t {
531+
zParams: ZDICT_params_t {
532+
compressionLevel: 0,
533+
notificationLevel: 0,
534+
dictID: 0,
535+
},
536+
selectivityLevel: 0,
537+
};
538+
539+
let dict_capacity = 1024;
540+
let mut dict_buffer = vec![0u8; dict_capacity];
541+
542+
let dict_size = ZDICT_trainFromBuffer_legacy(
543+
dict_buffer.as_mut_ptr() as *mut c_void,
544+
dict_buffer.len(),
545+
sample_data.as_ptr() as *const c_void,
546+
sample_sizes.as_ptr(),
547+
sample_sizes.len() as u32,
548+
params,
549+
);
550+
551+
if ZDICT_isError(dict_size) != 0 {
552+
Err(CStr::from_ptr(ZDICT_getErrorName(dict_size)).to_str())
553+
} else {
554+
dict_buffer.truncate(dict_size);
555+
556+
println!("Dictionary size: {}", dict_size);
557+
558+
Ok(dict_buffer)
559+
}
560+
});
561+
}
562+
475563
#[test]
476564
#[cfg(not(target_family = "wasm"))]
477565
fn test_optimize_train_from_buffer_cover_single_threaded() {

0 commit comments

Comments
 (0)