@@ -183,11 +183,61 @@ struct RequestBody {
183183fn 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