fix arithmetic side-effects
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
52a561ff9e
commit
7397064edd
25 changed files with 139 additions and 114 deletions
|
@ -1,6 +1,6 @@
|
|||
use std::{collections::HashSet, mem::size_of, sync::Arc};
|
||||
|
||||
use conduit::{utils, Error, Result};
|
||||
use conduit::{checked, utils, Error, Result};
|
||||
use database::{Database, Map};
|
||||
|
||||
use super::CompressedStateEvent;
|
||||
|
@ -38,11 +38,12 @@ impl Data {
|
|||
let mut added = HashSet::new();
|
||||
let mut removed = HashSet::new();
|
||||
|
||||
let mut i = size_of::<u64>();
|
||||
while let Some(v) = value.get(i..i + 2 * size_of::<u64>()) {
|
||||
let stride = size_of::<u64>();
|
||||
let mut i = stride;
|
||||
while let Some(v) = value.get(i..checked!(i + 2 * stride)?) {
|
||||
if add_mode && v.starts_with(&0_u64.to_be_bytes()) {
|
||||
add_mode = false;
|
||||
i += size_of::<u64>();
|
||||
i = checked!(i + stride)?;
|
||||
continue;
|
||||
}
|
||||
if add_mode {
|
||||
|
@ -50,7 +51,7 @@ impl Data {
|
|||
} else {
|
||||
removed.insert(v.try_into().expect("we checked the size above"));
|
||||
}
|
||||
i += 2 * size_of::<u64>();
|
||||
i = checked!(i + 2 * stride)?;
|
||||
}
|
||||
|
||||
Ok(StateDiff {
|
||||
|
|
|
@ -7,7 +7,7 @@ use std::{
|
|||
sync::{Arc, Mutex as StdMutex, Mutex},
|
||||
};
|
||||
|
||||
use conduit::{utils, Result};
|
||||
use conduit::{checked, utils, Result};
|
||||
use data::Data;
|
||||
use lru_cache::LruCache;
|
||||
use ruma::{EventId, RoomId};
|
||||
|
@ -169,12 +169,14 @@ impl Service {
|
|||
statediffremoved: Arc<HashSet<CompressedStateEvent>>, diff_to_sibling: usize,
|
||||
mut parent_states: ParentStatesVec,
|
||||
) -> Result<()> {
|
||||
let diffsum = statediffnew.len() + statediffremoved.len();
|
||||
let statediffnew_len = statediffnew.len();
|
||||
let statediffremoved_len = statediffremoved.len();
|
||||
let diffsum = checked!(statediffnew_len + statediffremoved_len)?;
|
||||
|
||||
if parent_states.len() > 3 {
|
||||
// Number of layers
|
||||
// To many layers, we have to go deeper
|
||||
let parent = parent_states.pop().unwrap();
|
||||
let parent = parent_states.pop().expect("parent must have a state");
|
||||
|
||||
let mut parent_new = (*parent.2).clone();
|
||||
let mut parent_removed = (*parent.3).clone();
|
||||
|
@ -226,10 +228,12 @@ impl Service {
|
|||
// 1. We add the current diff on top of the parent layer.
|
||||
// 2. We replace a layer above
|
||||
|
||||
let parent = parent_states.pop().unwrap();
|
||||
let parent_diff = parent.2.len() + parent.3.len();
|
||||
let parent = parent_states.pop().expect("parent must have a state");
|
||||
let parent_2_len = parent.2.len();
|
||||
let parent_3_len = parent.3.len();
|
||||
let parent_diff = checked!(parent_2_len + parent_3_len)?;
|
||||
|
||||
if diffsum * diffsum >= 2 * diff_to_sibling * parent_diff {
|
||||
if checked!(diffsum * diffsum)? >= checked!(2 * diff_to_sibling * parent_diff)? {
|
||||
// Diff too big, we replace above layer(s)
|
||||
let mut parent_new = (*parent.2).clone();
|
||||
let mut parent_removed = (*parent.3).clone();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue