Skip to content

Commit 31c67cf

Browse files
tomusdrwordian
authored andcommitted
Fix off-by-one. (#243)
* Fix off-by-one. * Fix.
1 parent 2b39ab9 commit 31c67cf

File tree

2 files changed

+43
-3
lines changed

2 files changed

+43
-3
lines changed

primitive-types/impls/serde/Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "impl-serde"
3-
version = "0.2.1"
3+
version = "0.2.2"
44
authors = ["Parity Technologies <[email protected]>"]
55
license = "Apache-2.0/MIT"
66
homepage = "https://github.com/paritytech/parity-common"
@@ -11,8 +11,9 @@ serde = "1.0"
1111

1212
[dev-dependencies]
1313
criterion = "0.3.0"
14-
uint = "0.8.1"
14+
serde_derive = "1.0"
1515
serde_json = "1.0.40"
16+
uint = "0.8.1"
1617

1718
[[bench]]
1819
name = "impl_serde"

primitive-types/impls/serde/src/serialize.rs

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)