Skip to content

HeaderMap::Drain can cause data race #355

@Qwaz

Description

@Qwaz

http/src/header/map.rs

Lines 2099 to 2102 in 9c05e39

impl<'a, T> Iterator for Drain<'a, T> {
type Item = (HeaderName, ValueDrain<'a, T>);
fn next(&mut self) -> Option<Self::Item> {

HeaderMap::Drain implements Iterator trait with Item = (HeaderName, ValueDrain<'a, T>). This definition makes it possible to create multiple mutable references to the underlying HeaderMap by creating multiple ValueDrain, because there is no relation between the lifetime of &mut self and the returned ValueDrain.

This bug may invalidate ValueDrain iterators or make them return incorrect results. In multi-threaded scenario, the bug allows multiple threads to mutate underlying Vec at the same time, which I believe exploitable. However, I expect no code is sending ValueDrain to the other thread in practice.

Demonstration

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-headersArea: HTTP headersE-hardEffort: hard.S-bugSeverity: bug. Something is wrong!

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions