@@ -105,7 +105,7 @@ pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error> where
105105
106106 let bytes_len = v. len ( ) - 2 ;
107107 let mut modulus = bytes_len % 2 ;
108- let mut bytes = vec ! [ 0u8 ; bytes_len / 2 ] ;
108+ let mut bytes = vec ! [ 0u8 ; ( bytes_len + 1 ) / 2 ] ;
109109 let mut buf = 0 ;
110110 let mut pos = 0 ;
111111 for ( idx, byte) in v. bytes ( ) . enumerate ( ) . skip ( 2 ) {
@@ -217,3 +217,42 @@ pub fn deserialize_check_len<'a, 'de, D>(deserializer: D, len: ExpectedLen<'a>)
217217
218218 deserializer. deserialize_str ( Visitor { len } )
219219}
220+
221+ #[ cfg( test) ]
222+ mod tests {
223+ extern crate serde_derive;
224+
225+ use self :: serde_derive:: Deserialize ;
226+
227+ #[ derive( Deserialize ) ]
228+ struct Bytes ( #[ serde( with="super" ) ] Vec < u8 > ) ;
229+
230+ #[ test]
231+ fn should_not_fail_on_short_string ( ) {
232+ let a: Bytes = serde_json:: from_str ( "\" 0x\" " ) . unwrap ( ) ;
233+ let b: Bytes = serde_json:: from_str ( "\" 0x1\" " ) . unwrap ( ) ;
234+ let c: Bytes = serde_json:: from_str ( "\" 0x12\" " ) . unwrap ( ) ;
235+ let d: Bytes = serde_json:: from_str ( "\" 0x123\" " ) . unwrap ( ) ;
236+ let e: Bytes = serde_json:: from_str ( "\" 0x1234\" " ) . unwrap ( ) ;
237+ let f: Bytes = serde_json:: from_str ( "\" 0x12345\" " ) . unwrap ( ) ;
238+
239+ assert ! ( a. 0 . is_empty( ) ) ;
240+ assert_eq ! ( b. 0 , vec![ 1 ] ) ;
241+ assert_eq ! ( c. 0 , vec![ 0x12 ] ) ;
242+ assert_eq ! ( d. 0 , vec![ 0x1 , 0x23 ] ) ;
243+ assert_eq ! ( e. 0 , vec![ 0x12 , 0x34 ] ) ;
244+ assert_eq ! ( f. 0 , vec![ 0x1 , 0x23 , 0x45 ] ) ;
245+ }
246+
247+
248+ #[ test]
249+ fn should_not_fail_on_other_strings ( ) {
250+ let a: Bytes = serde_json:: from_str ( "\" 0x7f864e18e3dd8b58386310d2fe0919eef27c6e558564b7f67f22d99d20f587\" " ) . unwrap ( ) ;
251+ let b: Bytes = serde_json:: from_str ( "\" 0x7f864e18e3dd8b58386310d2fe0919eef27c6e558564b7f67f22d99d20f587b\" " ) . unwrap ( ) ;
252+ let c: Bytes = serde_json:: from_str ( "\" 0x7f864e18e3dd8b58386310d2fe0919eef27c6e558564b7f67f22d99d20f587b4\" " ) . unwrap ( ) ;
253+
254+ assert_eq ! ( a. 0 . len( ) , 31 ) ;
255+ assert_eq ! ( b. 0 . len( ) , 32 ) ;
256+ assert_eq ! ( c. 0 . len( ) , 32 ) ;
257+ }
258+ }
0 commit comments