diff --git a/build/binder.rs b/build/binder.rs index 1c5475b03..1c60a8c1c 100644 --- a/build/binder.rs +++ b/build/binder.rs @@ -105,12 +105,27 @@ pub fn generate(modules: Vec, out: &mut W) { type Error = String; // TODO: define error types for each kind of failure fn try_from(buffer: &Vec) -> Result { + const MIN_MSG_SIZE: usize = 10; + // Parse start1 and start2 if !((buffer[0] == HEADER[0]) && (buffer[1] == HEADER[1])) { return Err(format!("Message should start with \"BR\" ASCII sequence, received: [{0}({:0x}), {1}({:0x})]", buffer[0], buffer[1])); } + let buffer_size = buffer.len(); + if buffer.len() < MIN_MSG_SIZE { + return Err(format!("Message is too short, should be at least {} bytes", MIN_MSG_SIZE).into()); + } + let payload_length = u16::from_le_bytes([buffer[2], buffer[3]]); + if payload_length as usize + MIN_MSG_SIZE != buffer.len() { + return Err(format!( + "Payload length does not match, expected: {}, received: {}", + payload_length, + buffer.len() - MIN_MSG_SIZE + )); + } + let protocol_message = ProtocolMessage { payload_length, message_id: u16::from_le_bytes([buffer[4], buffer[5]]),