use crate::{
file_format::{CompiledModule, CompiledScript},
file_format_common::*,
};
use move_core_types::vm_status::StatusCode;
fn malformed_simple_versioned_test(version: u32) {
let mut binary = BinaryConstants::DIEM_MAGIC.to_vec();
binary.extend(&version.to_le_bytes()); binary.push(150); binary.push(150); binary.push(1);
let res = CompiledScript::deserialize(&binary);
assert_eq!(
res.expect_err("Expected bad uleb").major_status(),
StatusCode::MALFORMED
);
let mut binary = BinaryConstants::DIEM_MAGIC.to_vec();
binary.extend(&version.to_le_bytes()); binary.push(150); binary.push(150); binary.push(150); binary.push(150); binary.push(150); binary.push(150); binary.push(150); binary.push(150); binary.push(150); binary.push(150); binary.push(150); binary.push(0); let res = CompiledScript::deserialize(&binary);
assert_eq!(
res.expect_err("Expected bad uleb").major_status(),
StatusCode::MALFORMED
);
let mut binary = BinaryConstants::DIEM_MAGIC.to_vec();
binary.extend(&version.to_le_bytes()); binary.push(0); let res = CompiledModule::deserialize(&binary);
assert_eq!(
res.expect_err("Expected no table count").major_status(),
StatusCode::MALFORMED
);
let mut binary = BinaryConstants::DIEM_MAGIC.to_vec();
binary.extend(&version.to_le_bytes()); binary.push(10); let res = CompiledModule::deserialize(&binary);
assert_eq!(
res.expect_err("Expected no table header").major_status(),
StatusCode::MALFORMED
);
let mut binary = BinaryConstants::DIEM_MAGIC.to_vec();
binary.extend(&version.to_le_bytes()); binary.push(1); binary.push(1); binary.push(0); binary.push(10); let res = CompiledScript::deserialize(&binary);
assert_eq!(
res.expect_err("Expected no table content").major_status(),
StatusCode::MALFORMED
);
let mut binary = BinaryConstants::DIEM_MAGIC.to_vec();
binary.extend(&version.to_le_bytes()); binary.push(1); binary.push(1); binary.push(100); binary.push(10); let res = CompiledModule::deserialize(&binary);
assert_eq!(
res.expect_err("Expected bad table offset").major_status(),
StatusCode::BAD_HEADER_TABLE
);
let mut binary = BinaryConstants::DIEM_MAGIC.to_vec();
binary.extend(&version.to_le_bytes()); binary.push(2); binary.push(1); binary.push(0); binary.push(10); binary.push(2); binary.push(100); binary.push(10); binary.resize(binary.len() + 5000, 0);
let res = CompiledModule::deserialize(&binary);
assert_eq!(
res.expect_err("Expected bad table offset").major_status(),
StatusCode::BAD_HEADER_TABLE
);
let mut binary = BinaryConstants::DIEM_MAGIC.to_vec();
binary.extend(&version.to_le_bytes()); binary.push(1); binary.push(1); binary.push(0); binary.push(10); binary.resize(binary.len() + 5, 0);
let res = CompiledScript::deserialize(&binary);
assert_eq!(
res.expect_err("Expected bad table content").major_status(),
StatusCode::MALFORMED
);
let mut binary = BinaryConstants::DIEM_MAGIC.to_vec();
binary.extend(&version.to_le_bytes()); binary.push(1); binary.push(100); binary.push(0); binary.push(10); binary.resize(binary.len() + 10, 0);
let res = CompiledModule::deserialize(&binary);
assert_eq!(
res.expect_err("Expected unknown table").major_status(),
StatusCode::UNKNOWN_TABLE_TYPE
);
let mut binary = BinaryConstants::DIEM_MAGIC.to_vec();
binary.extend(&version.to_le_bytes()); binary.push(3); binary.push(1); binary.push(0); binary.push(10); binary.push(2); binary.push(10); binary.push(10); binary.push(1); binary.push(20); binary.push(10); binary.resize(binary.len() + 5000, 0);
let res = CompiledScript::deserialize(&binary);
assert_eq!(
res.expect_err("Expected table offset overflow")
.major_status(),
StatusCode::DUPLICATE_TABLE
);
let mut binary = BinaryConstants::DIEM_MAGIC.to_vec();
binary.extend(&version.to_le_bytes()); binary.push(1); binary.push(0xD); binary.push(0); binary.push(10); binary.resize(binary.len() + 5000, 0);
let res = CompiledScript::deserialize(&binary);
assert_eq!(
res.expect_err("Expected table offset overflow")
.major_status(),
StatusCode::MALFORMED
);
}
#[test]
#[allow(clippy::same_item_push)]
fn malformed_simple() {
let binary = vec![];
let res = CompiledScript::deserialize(&binary);
assert_eq!(
res.expect_err("Expected malformed binary").major_status(),
StatusCode::BAD_MAGIC
);
let binary = vec![0u8, 0u8, 0u8];
let res = CompiledScript::deserialize(&binary);
assert_eq!(
res.expect_err("Expected malformed binary").major_status(),
StatusCode::BAD_MAGIC
);
let binary = vec![0u8; 4];
let res = CompiledScript::deserialize(&binary);
assert_eq!(
res.expect_err("Expected bad magic").major_status(),
StatusCode::BAD_MAGIC
);
let binary = BinaryConstants::DIEM_MAGIC.to_vec();
let res = CompiledScript::deserialize(&binary);
assert_eq!(
res.expect_err("Expected malformed binary").major_status(),
StatusCode::MALFORMED
);
let mut binary = BinaryConstants::DIEM_MAGIC.to_vec();
binary.extend(&(VERSION_MAX.checked_add(1).unwrap()).to_le_bytes()); binary.push(10); binary.push(0); let res = CompiledScript::deserialize(&binary);
assert_eq!(
res.expect_err("Expected unknown version").major_status(),
StatusCode::UNKNOWN_VERSION
);
for version in VERSION_1..VERSION_MAX {
malformed_simple_versioned_test(version);
}
}
static EMPTY_SCRIPT: &[u8] = include_bytes!("empty_script.mv");
#[test]
fn deserialize_file() {
CompiledScript::deserialize(EMPTY_SCRIPT).expect("script should deserialize properly");
}
static INVALID_SCRIPT_NO_SIGNATURE: &[u8] = include_bytes!("invalid_script_no_signature.mv");
#[test]
fn deserialize_invalid_script_no_signature() {
assert_eq!(
CompiledScript::deserialize(INVALID_SCRIPT_NO_SIGNATURE)
.unwrap_err()
.major_status(),
StatusCode::INDEX_OUT_OF_BOUNDS
);
}