appsignal / mongo-rust-driver

Mongo Rust driver built on top of the Mongo C driver
Apache License 2.0
89 stars 22 forks source link

Memory leak in `command_simple` #70

Open kamulos opened 3 years ago

kamulos commented 3 years ago

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...

kamulos commented 3 years ago

I also forwarded this issue to the libmongoc issue tracker: https://jira.mongodb.org/browse/CDRIVER-4039