Fix subtraction overflow when calculating index for `MultiValue::get()`.

Return `None` instead of panic in debug mode.
Fixes #232
This commit is contained in:
Alex Orlenko 2022-12-15 21:10:31 +00:00
parent 9716918517
commit 05eb20f9c6
No known key found for this signature in database
GPG Key ID: 4C150C250863B96D
2 changed files with 23 additions and 3 deletions

View File

@ -197,7 +197,6 @@ pub struct MultiValue<'lua>(Vec<Value<'lua>>);
impl<'lua> MultiValue<'lua> {
/// Creates an empty `MultiValue` containing no values.
#[inline]
pub const fn new() -> MultiValue<'lua> {
MultiValue(Vec::new())
}
@ -276,7 +275,10 @@ impl<'lua> MultiValue<'lua> {
#[inline]
pub fn get(&self, index: usize) -> Option<&Value<'lua>> {
self.0.get(self.0.len() - index - 1)
if index < self.0.len() {
return self.0.get(self.0.len() - index - 1);
}
None
}
#[inline]

View File

@ -1,6 +1,6 @@
use std::ptr;
use mlua::{Lua, Result, Value};
use mlua::{Lua, MultiValue, Result, Value};
#[test]
fn test_value_eq() -> Result<()> {
@ -63,3 +63,21 @@ fn test_value_eq() -> Result<()> {
Ok(())
}
#[test]
fn test_multi_value() {
let mut multi_value = MultiValue::new();
assert_eq!(multi_value.len(), 0);
assert_eq!(multi_value.get(0), None);
multi_value.push_front(Value::Number(2.));
multi_value.push_front(Value::Number(1.));
assert_eq!(multi_value.get(0), Some(&Value::Number(1.)));
assert_eq!(multi_value.get(1), Some(&Value::Number(2.)));
assert_eq!(multi_value.pop_front(), Some(Value::Number(1.)));
assert_eq!(multi_value[0], Value::Number(2.));
multi_value.clear();
assert!(multi_value.is_empty());
}