[cosmos] Require governance instruction bytes to be completely consumed (#448)
* add test * fix build Co-authored-by: Jayant Krishnamurthy <jkrishnamurthy@jumptrading.com>
This commit is contained in:
parent
695b096bb8
commit
6833f41424
|
@ -137,6 +137,16 @@ impl GovernanceInstruction {
|
||||||
_ => Err(format!("Unknown governance action type: {action_type}",)),
|
_ => Err(format!("Unknown governance action type: {action_type}",)),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Check that we're at the end of the buffer (to ensure that this contract knows how to
|
||||||
|
// interpret every field in the governance message). The logic is a little janky
|
||||||
|
// but seems to be the simplest way to check that the reader is at EOF.
|
||||||
|
let mut next_byte = [0_u8; 1];
|
||||||
|
let read_result = bytes.read(&mut next_byte);
|
||||||
|
match read_result {
|
||||||
|
Ok(0) => (),
|
||||||
|
_ => Err("Governance action had an unexpectedly long payload.".to_string())?,
|
||||||
|
}
|
||||||
|
|
||||||
Ok(GovernanceInstruction {
|
Ok(GovernanceInstruction {
|
||||||
module,
|
module,
|
||||||
action: action?,
|
action: action?,
|
||||||
|
@ -205,3 +215,37 @@ impl GovernanceInstruction {
|
||||||
Ok(buf)
|
Ok(buf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use crate::governance::{
|
||||||
|
GovernanceAction,
|
||||||
|
GovernanceInstruction,
|
||||||
|
GovernanceModule,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_payload_wrong_size() {
|
||||||
|
let instruction = GovernanceInstruction {
|
||||||
|
module: GovernanceModule::Target,
|
||||||
|
action: GovernanceAction::SetFee {
|
||||||
|
val: 100,
|
||||||
|
expo: 200,
|
||||||
|
},
|
||||||
|
target_chain_id: 7,
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut buf: Vec<u8> = instruction.serialize().unwrap();
|
||||||
|
|
||||||
|
let result = GovernanceInstruction::deserialize(buf.as_slice());
|
||||||
|
assert!(result.is_ok());
|
||||||
|
assert_eq!(result.unwrap(), instruction);
|
||||||
|
|
||||||
|
buf.push(0);
|
||||||
|
let result = GovernanceInstruction::deserialize(buf.as_slice());
|
||||||
|
assert!(result.is_err());
|
||||||
|
|
||||||
|
let result = GovernanceInstruction::deserialize(&buf[0..buf.len() - 2]);
|
||||||
|
assert!(result.is_err());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue