Skip to content

Commit 2c810f4

Browse files
authored
Guard against incomplete list/maps (#207)
1 parent 0b175da commit 2c810f4

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

lib/src/packstream/de.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,9 @@ impl<'a, 'de> SeqAccess<'de> for ItemsParser<'a> {
377377
self.len -= 1;
378378

379379
let bytes = self.bytes.get();
380+
if bytes.is_empty() {
381+
return Ok(None);
382+
}
380383
seed.deserialize(Deserializer { bytes }).map(Some)
381384
}
382385

@@ -398,6 +401,9 @@ impl<'a, 'de> MapAccess<'de> for ItemsParser<'a> {
398401
self.len -= 1;
399402

400403
let bytes = self.bytes.get();
404+
if bytes.is_empty() {
405+
return Ok(None);
406+
}
401407
seed.deserialize(Deserializer { bytes }).map(Some)
402408
}
403409

lib/src/packstream/mod.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,4 +611,24 @@ mod tests {
611611
let expected = Bytes::copy_from_slice(input);
612612
assert_eq!(actual, expected);
613613
}
614+
615+
#[test]
616+
fn dont_fail_on_wrong_lengths() {
617+
let wrong_list = bolt()
618+
.tiny_list(3) // says it's three elements
619+
.tiny_int(42) // but it's not
620+
.build();
621+
622+
assert_eq!(from_bytes::<Vec<u32>>(wrong_list).unwrap(), vec![42]);
623+
624+
let wrong_map = bolt()
625+
.tiny_map(3) // says it's three elements
626+
.tiny_string("key") // but it's not
627+
.tiny_int(42)
628+
.build();
629+
630+
let data = from_bytes::<std::collections::HashMap<String, u32>>(wrong_map).unwrap();
631+
assert_eq!(data.len(), 1);
632+
assert_eq!(data.get("key").copied(), Some(42));
633+
}
614634
}

0 commit comments

Comments
 (0)