VDB
Sign up
MEDIUM

GHSA-83gg-pwxf-jr89

`array!` macro is unsound in presence of traits that implement methods it calls internally

Details

Affected versions of this crate called some methods using auto-ref. The affected code looked like this.

```rust let mut arr = $crate::__core::mem::MaybeUninit::uninit(); let mut vec = $crate::__ArrayVec::<T>::new(arr.as_mut_ptr() as *mut T); ```

In this case, the problem is that `as_mut_ptr` is a method of `&mut MaybeUninit`, not `MaybeUninit`. This made it possible for traits to hijack the method calls in order to cause unsoundness.

```rust trait AsMutPtr<T> { fn as_mut_ptr(&self) -> *mut T; } impl<T> AsMutPtr<T> for std::mem::MaybeUninit<T> { fn as_mut_ptr(&self) -> *mut T { std::ptr::null_mut() } } array![0; 1]; ```

The flaw was corrected by explicitly referencing variables in macro body in order to avoid auto-ref.

Are you affected?

Enter the version of the package you're using.

Affected packages

crates.io/array-macro
Introduced in: 0.1.2Fixed in: 1.0.5

Upgrade array-macro to 1.0.5 or newer (ecosystem crates.io).

References