Skip to content

Memory leak in command_simple #70

@kamulos

Description

@kamulos

This is really strange

Reproduction

use bson::doc;
use mongo_driver::client::{ClientPool, Uri};

fn main() {
    let mongo_uri = Uri::new("mongodb://127.0.0.1:27017").unwrap();
    let pool = ClientPool::new(mongo_uri, None);
    let ping = doc! {"ping": 1};
    pool.pop()
        .get_database("admin")
        .command_simple(ping, None)
        .unwrap();
}

Run it with:

RUSTFLAGS="$RUSTFLAGS -Zsanitizer=address" cargo +nightly run --target=x86_64-unknown-linux-gnu

Possible reason

In database::command_simple(), when the bson_t is created the flags are set to 1, but after the bindings::mongoc_database_command_simple() the flags are set to 2. This means BSON_FLAG_STATIC which leads to skipping the free() in bson_destroy().

Not sure how this works internally, but this is my best guess...

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions