{"id":"GHSA-f85w-wvc7-crwc","aliases":["RUSTSEC-2022-0078"],"status":"published","title":"bumpalo has use-after-free due to a lifetime error in `Vec::into_iter()`","description":"In affected versions of this crate, the lifetime of the iterator produced by `Vec::into_iter()` is not constrained to the lifetime of the `Bump` that allocated the vector's memory. Using the iterator after the `Bump` is dropped causes use-after-free accesses.\n\nThe following example demonstrates memory corruption arising from a misuse of this unsoundness.\n\n```rust\nuse bumpalo::{collections::Vec, Bump};\n\nfn main() {\n    let bump = Bump::new();\n    let mut vec = Vec::new_in(\u0026bump);\n    vec.extend([0x01u8; 32]);\n    let into_iter = vec.into_iter();\n    drop(bump);\n\n    for _ in 0..100 {\n        let reuse_bump = Bump::new();\n        let _reuse_alloc = reuse_bump.alloc([0x41u8; 10]);\n    }\n\n    for x in into_iter {\n        print!(\"0x{:02x} \", x);\n    }\n    println!();\n}\n```\n\nThe issue was corrected in version 3.11.1 by adding a lifetime to the `IntoIter` type, and updating the signature of `Vec::into_iter()` to constrain this lifetime.","facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"published":"2022-01-14T12:00:00Z","modified":"2026-09-10T03:49:51Z","fixes":[{"ecosystem":"crates.io","package":"bumpalo","fixed_in":["3.11.1"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"crates.io","package":"bumpalo","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"1.1.0"},{"fixed":"3.11.1"}]}]},{"source":"osv","ecosystem":"crates.io","package":"bumpalo","ranges":[{"type":"SEMVER","events":[{"introduced":"1.1.0"},{"fixed":"3.11.1"}]}]},{"source":"osv","ecosystem":"crates.io","package":"bumpalo","ranges":[{"type":"SEMVER","events":[{"introduced":"1.1.0"},{"fixed":"3.11.1"}]}]}],"references":[{"url":"https://github.com/fitzgen/bumpalo/blob/main/CHANGELOG.md#3111","tags":["web"]},{"url":"https://rustsec.org/advisories/RUSTSEC-2022-0078.html","tags":["web","advisory"]},{"url":"https://github.com/advisories/GHSA-f85w-wvc7-crwc"},{"url":"https://github.com/fitzgen/bumpalo","tags":["package"]},{"url":"https://crates.io/crates/bumpalo","tags":["package"]}],"sources":{"ghsa":[{"id":"GHSA-f85w-wvc7-crwc","title":"bumpalo has use-after-free due to a lifetime error in `Vec::into_iter()`","description":"In affected versions of this crate, the lifetime of the iterator produced by `Vec::into_iter()` is not constrained to the lifetime of the `Bump` that allocated the vector's memory. Using the iterator after the `Bump` is dropped causes use-after-free accesses.\n\nThe following example demonstrates memory corruption arising from a misuse of this unsoundness.\n\n```rust\nuse bumpalo::{collections::Vec, Bump};\n\nfn main() {\n    let bump = Bump::new();\n    let mut vec = Vec::new_in(\u0026bump);\n    vec.extend([0x01u8; 32]);\n    let into_iter = vec.into_iter();\n    drop(bump);\n\n    for _ in 0..100 {\n        let reuse_bump = Bump::new();\n        let _reuse_alloc = reuse_bump.alloc([0x41u8; 10]);\n    }\n\n    for x in into_iter {\n        print!(\"0x{:02x} \", x);\n    }\n    println!();\n}\n```\n\nThe issue was corrected in version 3.11.1 by adding a lifetime to the `IntoIter` type, and updating the signature of `Vec::into_iter()` to constrain this lifetime.\n","status":"published","published":"2023-01-20T21:54:22Z","modified":"2023-01-20T21:54:22Z","updated_at":"2026-11-02T14:36:14.033357Z"}],"osv":[{"id":"GHSA-f85w-wvc7-crwc","title":"bumpalo has use-after-free due to a lifetime error in `Vec::into_iter()`","description":"In affected versions of this crate, the lifetime of the iterator produced by `Vec::into_iter()` is not constrained to the lifetime of the `Bump` that allocated the vector's memory. Using the iterator after the `Bump` is dropped causes use-after-free accesses.\n\nThe following example demonstrates memory corruption arising from a misuse of this unsoundness.\n\n```rust\nuse bumpalo::{collections::Vec, Bump};\n\nfn main() {\n    let bump = Bump::new();\n    let mut vec = Vec::new_in(\u0026bump);\n    vec.extend([0x01u8; 32]);\n    let into_iter = vec.into_iter();\n    drop(bump);\n\n    for _ in 0..100 {\n        let reuse_bump = Bump::new();\n        let _reuse_alloc = reuse_bump.alloc([0x41u8; 10]);\n    }\n\n    for x in into_iter {\n        print!(\"0x{:02x} \", x);\n    }\n    println!();\n}\n```\n\nThe issue was corrected in version 3.11.1 by adding a lifetime to the `IntoIter` type, and updating the signature of `Vec::into_iter()` to constrain this lifetime.\n","status":"published","published":"2023-01-20T21:54:22Z","modified":"2026-09-10T03:49:51.242906965Z","updated_at":"2026-11-02T15:46:46.006631Z"},{"id":"RUSTSEC-2022-0078","title":"Use-after-free due to a lifetime error in `Vec::into_iter()`","description":"In affected versions of this crate, the lifetime of the iterator produced by\n`Vec::into_iter()` is not constrained to the lifetime of the `Bump` that\nallocated the vector's memory. Using the iterator after the `Bump` is dropped\ncauses use-after-free accesses.\n\nThe following example demonstrates memory corruption arising from a misuse of\nthis unsoundness.\n\n```rust\nuse bumpalo::{collections::Vec, Bump};\n\nfn main() {\n    let bump = Bump::new();\n    let mut vec = Vec::new_in(\u0026bump);\n    vec.extend([0x01u8; 32]);\n    let into_iter = vec.into_iter();\n    drop(bump);\n\n    for _ in 0..100 {\n        let reuse_bump = Bump::new();\n        let _reuse_alloc = reuse_bump.alloc([0x41u8; 10]);\n    }\n\n    for x in into_iter {\n        print!(\"0x{:02x} \", x);\n    }\n    println!();\n}\n```\n\nThe issue was corrected in version 3.11.1 by adding a lifetime to the `IntoIter`\ntype, and updating the signature of `Vec::into_iter()` to constrain this\nlifetime.","status":"published","published":"2022-01-14T12:00:00Z","modified":"2023-11-08T04:18:53.654955Z","updated_at":"2026-11-02T15:53:39.971022Z"}]}}
