GHSA-83gg-pwxf-jr89

Suggest an improvement
Source
https://github.com/advisories/GHSA-83gg-pwxf-jr89
Import Source
https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2022/06/GHSA-83gg-pwxf-jr89/GHSA-83gg-pwxf-jr89.json
JSON Data
https://api.osv.dev/v1/vulns/GHSA-83gg-pwxf-jr89
Aliases
Published
2022-06-16T23:40:19Z
Modified
2023-11-08T04:17:08.031225Z
Summary
`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.

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.

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.

Database specific
{
    "nvd_published_at": null,
    "cwe_ids": [],
    "severity": "MODERATE",
    "github_reviewed": true,
    "github_reviewed_at": "2022-06-16T23:40:19Z"
}
References

Affected packages

crates.io / array-macro

Package

Affected ranges

Type
SEMVER
Events
Introduced
0.1.2
Fixed
1.0.5