Skip to content

Commit 1e18ed0

Browse files
committed
Restrict debug output size for the Any type
1 parent 6743a16 commit 1e18ed0

File tree

1 file changed

+60
-1
lines changed

1 file changed

+60
-1
lines changed

modules/types/src/any.rs

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
use crate::errors::TypeError;
22
use crate::prelude::*;
3+
use core::fmt::{Debug, Formatter, Result as DebugResult};
34
use core::ops::Deref;
45
use lcp_proto::{google::protobuf::Any as ProtoAny, protobuf::Protobuf};
56
use serde::{Deserialize, Serialize};
67

7-
#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)]
8+
const MAX_VALUE_LENGTH_FOR_DEBUG: usize = 1024;
9+
10+
#[derive(Default, Clone, PartialEq, Serialize, Deserialize)]
811
#[serde(transparent)]
912
pub struct Any(#[serde(with = "ProtoAnyDef")] ProtoAny);
1013

@@ -18,6 +21,24 @@ impl Any {
1821
}
1922
}
2023

24+
impl Debug for Any {
25+
fn fmt(&self, f: &mut Formatter<'_>) -> DebugResult {
26+
let mut debug = f.debug_struct("Any");
27+
debug.field("type_url", &self.type_url);
28+
if self.value.len() > MAX_VALUE_LENGTH_FOR_DEBUG {
29+
debug
30+
.field("total_value_size", &self.value.len())
31+
.field(
32+
&format!("first_{}_value", MAX_VALUE_LENGTH_FOR_DEBUG),
33+
&&self.value[..MAX_VALUE_LENGTH_FOR_DEBUG],
34+
);
35+
} else {
36+
debug.field("value", &self.value);
37+
}
38+
debug.finish()
39+
}
40+
}
41+
2142
impl Deref for Any {
2243
type Target = ProtoAny;
2344

@@ -111,4 +132,42 @@ mod tests {
111132
assert_eq!(any1, any3);
112133
}
113134
}
135+
136+
#[test]
137+
fn test_debug_any() {
138+
let type_url = "type_url".to_string();
139+
let base = Any::new(type_url.clone(), [0u8; MAX_VALUE_LENGTH_FOR_DEBUG].to_vec());
140+
let base_str = format!("{:?}", base);
141+
{
142+
let value = [0u8; MAX_VALUE_LENGTH_FOR_DEBUG + 1].to_vec();
143+
let value_str = format!("{:?}", Any::new(type_url.clone(), value));
144+
let expected_str = base_str.replace(
145+
"value",
146+
&format!(
147+
"total_value_size: {}, first_{}_value",
148+
MAX_VALUE_LENGTH_FOR_DEBUG + 1,
149+
MAX_VALUE_LENGTH_FOR_DEBUG
150+
),
151+
);
152+
assert_eq!(value_str, expected_str);
153+
}
154+
{
155+
let value = [0u8; MAX_VALUE_LENGTH_FOR_DEBUG].to_vec();
156+
assert_eq!(base_str, format!("{:?}", Any::new(type_url.clone(), value)));
157+
}
158+
{
159+
let value = [0u8; MAX_VALUE_LENGTH_FOR_DEBUG - 1].to_vec();
160+
let value_str = format!("{:?}", Any::new(type_url.clone(), value));
161+
let unexpected_str = base_str.replace(
162+
"value",
163+
&format!(
164+
"total_value_size: {}, first_{}_value",
165+
MAX_VALUE_LENGTH_FOR_DEBUG - 1,
166+
MAX_VALUE_LENGTH_FOR_DEBUG
167+
),
168+
);
169+
assert_ne!(base_str, value_str);
170+
assert_ne!(value_str, unexpected_str);
171+
}
172+
}
114173
}

0 commit comments

Comments
 (0)