Skip to content

Commit 0f72425

Browse files
committed
fix: skip malformed trace containers without allocation
1 parent 26af25b commit 0f72425

1 file changed

Lines changed: 64 additions & 5 deletions

File tree

‎packages/sie_server_sidecar/src/local_ingest.rs‎

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -183,11 +183,61 @@ struct RequestBody {
183183
fn optional_trace_string<'de, D: serde::Deserializer<'de>>(
184184
deserializer: D,
185185
) -> Result<Option<String>, D::Error> {
186-
let value = rmpv::Value::deserialize(deserializer)?;
187-
Ok(value
188-
.as_str()
189-
.filter(|value| value.len() <= 512)
190-
.map(str::to_owned))
186+
struct TraceString;
187+
impl<'de> serde::de::Visitor<'de> for TraceString {
188+
type Value = Option<String>;
189+
fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
190+
formatter.write_str("optional bounded trace string")
191+
}
192+
fn visit_str<E: serde::de::Error>(self, value: &str) -> Result<Self::Value, E> {
193+
Ok((value.len() <= 512).then(|| value.to_owned()))
194+
}
195+
fn visit_bool<E: serde::de::Error>(self, _: bool) -> Result<Self::Value, E> {
196+
Ok(None)
197+
}
198+
fn visit_i64<E: serde::de::Error>(self, _: i64) -> Result<Self::Value, E> {
199+
Ok(None)
200+
}
201+
fn visit_u64<E: serde::de::Error>(self, _: u64) -> Result<Self::Value, E> {
202+
Ok(None)
203+
}
204+
fn visit_f64<E: serde::de::Error>(self, _: f64) -> Result<Self::Value, E> {
205+
Ok(None)
206+
}
207+
fn visit_unit<E: serde::de::Error>(self) -> Result<Self::Value, E> {
208+
Ok(None)
209+
}
210+
fn visit_bytes<E: serde::de::Error>(self, _: &[u8]) -> Result<Self::Value, E> {
211+
Ok(None)
212+
}
213+
fn visit_newtype_struct<D: serde::Deserializer<'de>>(
214+
self,
215+
deserializer: D,
216+
) -> Result<Self::Value, D::Error> {
217+
serde::de::IgnoredAny::deserialize(deserializer)?;
218+
Ok(None)
219+
}
220+
fn visit_seq<A: serde::de::SeqAccess<'de>>(
221+
self,
222+
mut sequence: A,
223+
) -> Result<Self::Value, A::Error> {
224+
while sequence.next_element::<serde::de::IgnoredAny>()?.is_some() {}
225+
Ok(None)
226+
}
227+
fn visit_map<A: serde::de::MapAccess<'de>>(
228+
self,
229+
mut map: A,
230+
) -> Result<Self::Value, A::Error> {
231+
while map
232+
.next_entry::<serde::de::IgnoredAny, serde::de::IgnoredAny>()?
233+
.is_some()
234+
{}
235+
Ok(None)
236+
}
237+
}
238+
// Skip wrong-typed containers without materializing a potentially large
239+
// Value tree. String input is borrowed and copied only within the bound.
240+
deserializer.deserialize_any(TraceString)
191241
}
192242

193243
#[derive(Debug, Deserialize, Serialize)]
@@ -1897,7 +1947,16 @@ mod tests {
18971947
fn malformed_optional_carriers_do_not_reject_request_decode() {
18981948
for value in [
18991949
rmpv::Value::from(42),
1950+
rmpv::Value::from(true),
1951+
rmpv::Value::from(-1),
1952+
rmpv::Value::from(1.5),
1953+
rmpv::Value::Nil,
1954+
rmpv::Value::Map(vec![(
1955+
"nested".into(),
1956+
rmpv::Value::Array(vec![rmpv::Value::Nil; 100_000]),
1957+
)]),
19001958
rmpv::Value::Binary(vec![1, 2]),
1959+
rmpv::Value::Ext(1, vec![1, 2]),
19011960
rmpv::Value::Array(vec![]),
19021961
rmpv::Value::from("x".repeat(513)),
19031962
] {

0 commit comments

Comments
 (0)