fix(dict): honor legacy dictionary capacity before copying segments
Delay the legacy dictionary segment copy until the effective content size is known, preventing writes beyond the caller-provided dictionary capacity. Test Plan: - RUSTC_WRAPPER= CARGO_BUILD_RUSTC_WRAPPER= cargo test --manifest-path rust/cli/Cargo.toml - make -C tests check V=1
This commit is contained in:
@@ -1140,6 +1140,20 @@ unsafe fn train_from_buffer_unsafe_legacy(
|
|||||||
if content_size < ZDICT_CONTENTSIZE_MIN {
|
if content_size < ZDICT_CONTENTSIZE_MIN {
|
||||||
return dictionary_error(ZstdErrorCode::DictionaryCreationFailed);
|
return dictionary_error(ZstdErrorCode::DictionaryCreationFailed);
|
||||||
}
|
}
|
||||||
|
let max = dict_list[0].pos as usize;
|
||||||
|
let mut current_size = 0usize;
|
||||||
|
let mut count = 1usize;
|
||||||
|
while count < max {
|
||||||
|
current_size += dict_list[count].length as usize;
|
||||||
|
if current_size > max_dict_size {
|
||||||
|
current_size -= dict_list[count].length as usize;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
dict_list[0].pos = count as u32;
|
||||||
|
content_size = current_size;
|
||||||
|
|
||||||
let output = unsafe { std::slice::from_raw_parts_mut(dict_buffer.cast::<u8>(), max_dict_size) };
|
let output = unsafe { std::slice::from_raw_parts_mut(dict_buffer.cast::<u8>(), max_dict_size) };
|
||||||
let mut write_at = max_dict_size;
|
let mut write_at = max_dict_size;
|
||||||
for item in dict_list.iter().take(dict_list[0].pos as usize).skip(1) {
|
for item in dict_list.iter().take(dict_list[0].pos as usize).skip(1) {
|
||||||
@@ -1157,19 +1171,6 @@ unsafe fn train_from_buffer_unsafe_legacy(
|
|||||||
.copy_from_slice(&samples_buffer[item.pos as usize..item.pos as usize + length]);
|
.copy_from_slice(&samples_buffer[item.pos as usize..item.pos as usize + length]);
|
||||||
}
|
}
|
||||||
|
|
||||||
let max = dict_list[0].pos as usize;
|
|
||||||
let mut current_size = 0usize;
|
|
||||||
let mut count = 1usize;
|
|
||||||
while count < max {
|
|
||||||
current_size += dict_list[count].length as usize;
|
|
||||||
if current_size > max_dict_size {
|
|
||||||
current_size -= dict_list[count].length as usize;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
count += 1;
|
|
||||||
}
|
|
||||||
dict_list[0].pos = count as u32;
|
|
||||||
content_size = current_size;
|
|
||||||
add_entropy_tables_advanced(
|
add_entropy_tables_advanced(
|
||||||
dict_buffer,
|
dict_buffer,
|
||||||
content_size,
|
content_size,
|
||||||
|
|||||||
Reference in New Issue
Block a user