Skip to content

Commit

Permalink
Add specific error code for memory helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
axic committed Apr 9, 2021
1 parent 583ced4 commit 7b98d59
Showing 1 changed file with 50 additions and 48 deletions.
98 changes: 50 additions & 48 deletions bindings/rust/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ pub enum Error {
FunctionNotFound,
ArgumentCountMismatch,
ArgumentTypeMismatch,
NoMemoryAvailable,
InvalidMemoryOffsetOrSize,
}

impl From<String> for Error {
Expand Down Expand Up @@ -407,10 +409,10 @@ impl Instance {
let offset = offset as usize;
let has_memory = memory_data != std::ptr::null_mut();
if !has_memory {
return Err("no memory is available".into());
return Err(Error::NoMemoryAvailable);
}
if offset.checked_add(size).is_none() || (offset + size) > memory_size {
return Err("invalid offset or size".into());
return Err(Error::InvalidMemoryOffsetOrSize);
}
Ok(offset..offset + size)
}
Expand Down Expand Up @@ -966,75 +968,75 @@ mod tests {
unsafe {
assert_eq!(
instance.checked_memory_slice(0, 0).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
assert_eq!(
instance.checked_memory_slice_mut(0, 0).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
assert_eq!(
instance.checked_memory_slice(0, 65536).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
assert_eq!(
instance.checked_memory_slice_mut(0, 65536).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
assert_eq!(
instance.checked_memory_slice(65535, 1).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
assert_eq!(
instance.checked_memory_slice_mut(65535, 1).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
assert_eq!(
instance.checked_memory_slice(65535, 2).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
assert_eq!(
instance.checked_memory_slice_mut(65535, 2).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
assert_eq!(
instance.checked_memory_slice(65536, 0).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
assert_eq!(
instance.checked_memory_slice_mut(65536, 0).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
assert_eq!(
instance.checked_memory_slice(65536, 1).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
assert_eq!(
instance.checked_memory_slice_mut(65536, 1).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
}

// Set memory via safe helper.
assert_eq!(
instance.memory_set(0, &[]).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
assert_eq!(
instance.memory_set(0, &[0x11, 0x22]).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
// Get memory via safe helper.
let mut dst: Vec<u8> = Vec::new();
dst.resize(65536, 0);
// Reading empty slice.
assert_eq!(
instance.memory_get(0, &mut dst[0..0]).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
// Reading 65536 bytes.
assert_eq!(
instance.memory_get(0, &mut dst).err().unwrap(),
Error::Other("no memory is available".into())
Error::NoMemoryAvailable
);
}

Expand Down Expand Up @@ -1062,51 +1064,51 @@ mod tests {
assert!(instance.checked_memory_slice_mut(0, 0).is_ok());
assert_eq!(
instance.checked_memory_slice(0, 65536).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance.checked_memory_slice_mut(0, 65536).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance.checked_memory_slice(65535, 1).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance.checked_memory_slice_mut(65535, 1).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance.checked_memory_slice(65535, 2).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance.checked_memory_slice_mut(65535, 2).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance.checked_memory_slice(65536, 0).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance.checked_memory_slice_mut(65536, 0).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance.checked_memory_slice(65536, 1).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance.checked_memory_slice_mut(65536, 1).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
}

// Set memory via safe helper.
assert!(instance.memory_set(0, &[]).is_ok());
assert_eq!(
instance.memory_set(0, &[0x11, 0x22]).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
// Get memory via safe helper.
let mut dst: Vec<u8> = Vec::new();
Expand All @@ -1116,7 +1118,7 @@ mod tests {
// Reading 65536 bytes.
assert_eq!(
instance.memory_get(0, &mut dst).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
}

Expand Down Expand Up @@ -1156,28 +1158,28 @@ mod tests {
// Reading over.
assert_eq!(
instance.checked_memory_slice(65535, 2).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance.checked_memory_slice_mut(65535, 2).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance.checked_memory_slice(65536, 1).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance.checked_memory_slice_mut(65536, 1).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
// Offset overflow.
assert_eq!(
instance.checked_memory_slice(65537, 0).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance.checked_memory_slice_mut(65537, 0).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
}

Expand Down Expand Up @@ -1237,7 +1239,7 @@ mod tests {
assert!(instance.memory_set(65536 + 65536, &[]).is_ok());
assert_eq!(
instance.memory_set(65536 + 65537, &[]).err().unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert!(instance.memory_set(0, &[0x11, 0x22, 0x33, 0x44]).is_ok());
assert!(instance
Expand All @@ -1248,35 +1250,35 @@ mod tests {
.memory_set(65536 + 65533, &[0x11, 0x22, 0x33, 0x44])
.err()
.unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance
.memory_set(65536 + 65534, &[0x11, 0x22, 0x33, 0x44])
.err()
.unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance
.memory_set(65536 + 65535, &[0x11, 0x22, 0x33, 0x44])
.err()
.unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance
.memory_set(65536 + 65536, &[0x11, 0x22, 0x33, 0x44])
.err()
.unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance
.memory_set(65536 + 65537, &[0x11, 0x22, 0x33, 0x44])
.err()
.unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);

let result = instance
Expand Down Expand Up @@ -1315,7 +1317,7 @@ mod tests {
.memory_get(65536 + 65537, &mut dst[0..0])
.err()
.unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);

// Read into short slice.
Expand All @@ -1326,35 +1328,35 @@ mod tests {
.memory_get(65536 + 65533, &mut dst[0..4])
.err()
.unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance
.memory_get(65536 + 65534, &mut dst[0..4])
.err()
.unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance
.memory_get(65536 + 65535, &mut dst[0..4])
.err()
.unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance
.memory_get(65536 + 65536, &mut dst[0..4])
.err()
.unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
assert_eq!(
instance
.memory_get(65536 + 65537, &mut dst[0..4])
.err()
.unwrap(),
Error::Other("invalid offset or size".into())
Error::InvalidMemoryOffsetOrSize
);
}
}

0 comments on commit 7b98d59

Please sign in to comment.