summaryrefslogtreecommitdiff
path: root/src/message.rs
diff options
context:
space:
mode:
authorStuart Stock <stuart@int08h.com>2018-03-24 10:50:42 -0500
committerStuart Stock <stuart@int08h.com>2018-03-24 11:29:33 -0500
commit9656fdab0f702ccd784a2e50eabcf94809bc31b5 (patch)
tree9f79ee6600afa1737064588c3d1085ba38aba2d0 /src/message.rs
parentabc7f8b603cac103fa714b84a4495e95f974f57f (diff)
downloadroughenough-9656fdab0f702ccd784a2e50eabcf94809bc31b5.zip
Check that value offset does not extend pass end of message
Diffstat (limited to 'src/message.rs')
-rw-r--r--src/message.rs13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/message.rs b/src/message.rs
index f9aad46..c8fb404 100644
--- a/src/message.rs
+++ b/src/message.rs
@@ -112,14 +112,19 @@ impl RtMessage {
// as an offset from the end of the header
let msg_end = bytes.len() - header_end;
- assert_eq!(offsets.len(), tags.len() - 1);
-
for (tag, (value_start, value_end)) in tags.into_iter().zip(
once(&0)
.chain(offsets.iter())
- .zip(offsets.iter().chain(once(&msg_end))),
+ .zip(offsets.iter().chain(once(&msg_end)))
) {
- let value = bytes[(header_end + value_start)..(header_end + value_end)].to_vec();
+ let start_idx = header_end + value_start;
+ let end_idx = header_end + value_end;
+
+ if end_idx > msg_end || start_idx > end_idx {
+ return Err(Error::InvalidValueLength(tag, end_idx as u32));
+ }
+
+ let value = bytes[start_idx..end_idx].to_vec();
rt_msg.add_field(tag, &value)?;
}