Skip to content

Commit 7503f4f

Browse files
authored
Merge pull request #570 from Dstack-TEE/fix/vecof-unbounded-alloc
fix: cap VecOf pre-allocation to prevent OOM on malformed input
2 parents 9be18df + ef774eb commit 7503f4f

1 file changed

Lines changed: 15 additions & 10 deletions

File tree

cc-eventlog/src/codecs.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ use std::ops::Deref;
77
use scale::{Decode, Input};
88

99
#[derive(Clone, Debug, PartialEq, Eq)]
10-
pub struct VecOf<I, T> {
10+
pub struct VecOf<I, T, const MAX_LEN: usize = 65536> {
1111
len: I,
1212
inner: Vec<T>,
1313
}
1414

15-
impl<I: Default, T> Default for VecOf<I, T> {
15+
impl<I: Default, T, const MAX_LEN: usize> Default for VecOf<I, T, MAX_LEN> {
1616
fn default() -> Self {
1717
Self {
1818
len: I::default(),
@@ -21,11 +21,16 @@ impl<I: Default, T> Default for VecOf<I, T> {
2121
}
2222
}
2323

24-
impl<I: Decode + Into<u32> + Copy, T: Decode> Decode for VecOf<I, T> {
24+
impl<I: Decode + Into<u32> + Copy, T: Decode, const MAX_LEN: usize> Decode
25+
for VecOf<I, T, MAX_LEN>
26+
{
2527
fn decode<In: Input>(input: &mut In) -> Result<Self, scale::Error> {
2628
let decoded_len = I::decode(input)?;
2729
let len = decoded_len.into() as usize;
28-
let mut inner = Vec::with_capacity(len);
30+
if len > MAX_LEN {
31+
return Err("VecOf length exceeds upper bound".into());
32+
}
33+
let mut inner = Vec::with_capacity(len.min(1024));
2934
for _ in 0..len {
3035
inner.push(T::decode(input)?);
3136
}
@@ -36,7 +41,7 @@ impl<I: Decode + Into<u32> + Copy, T: Decode> Decode for VecOf<I, T> {
3641
}
3742
}
3843

39-
impl<I, T> VecOf<I, T> {
44+
impl<I, T, const MAX_LEN: usize> VecOf<I, T, MAX_LEN> {
4045
pub fn into_inner(self) -> Vec<T> {
4146
self.inner
4247
}
@@ -49,28 +54,28 @@ impl<I, T> VecOf<I, T> {
4954
}
5055
}
5156

52-
impl<I, T> Deref for VecOf<I, T> {
57+
impl<I, T, const MAX_LEN: usize> Deref for VecOf<I, T, MAX_LEN> {
5358
type Target = Vec<T>;
5459

5560
fn deref(&self) -> &Self::Target {
5661
&self.inner
5762
}
5863
}
5964

60-
impl<I, T> From<(I, Vec<T>)> for VecOf<I, T> {
65+
impl<I, T, const MAX_LEN: usize> From<(I, Vec<T>)> for VecOf<I, T, MAX_LEN> {
6166
fn from((len, vec): (I, Vec<T>)) -> Self {
6267
Self { len, inner: vec }
6368
}
6469
}
6570

66-
impl<I, T> AsRef<[T]> for VecOf<I, T> {
71+
impl<I, T, const MAX_LEN: usize> AsRef<[T]> for VecOf<I, T, MAX_LEN> {
6772
fn as_ref(&self) -> &[T] {
6873
&self.inner
6974
}
7075
}
7176

72-
impl<I, T> From<VecOf<I, T>> for Vec<T> {
73-
fn from(value: VecOf<I, T>) -> Self {
77+
impl<I, T, const MAX_LEN: usize> From<VecOf<I, T, MAX_LEN>> for Vec<T> {
78+
fn from(value: VecOf<I, T, MAX_LEN>) -> Self {
7479
value.inner
7580
}
7681
}

0 commit comments

Comments
 (0)