diff options
author | Stuart Stock <stuart@int08h.com> | 2018-03-24 10:50:42 -0500 |
---|---|---|
committer | Stuart Stock <stuart@int08h.com> | 2018-03-24 11:29:33 -0500 |
commit | 9656fdab0f702ccd784a2e50eabcf94809bc31b5 (patch) | |
tree | 9f79ee6600afa1737064588c3d1085ba38aba2d0 /src/message.rs | |
parent | abc7f8b603cac103fa714b84a4495e95f974f57f (diff) | |
download | roughenough-9656fdab0f702ccd784a2e50eabcf94809bc31b5.zip |
Check that value offset does not extend pass end of message
Diffstat (limited to 'src/message.rs')
-rw-r--r-- | src/message.rs | 13 |
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)?; } |