Work around UB in LMDB bindings (#6211)

* Work around UB in LMDB bindings
This commit is contained in:
Michael Sproul
2024-08-01 16:46:37 +10:00
committed by GitHub
parent 9b3b730159
commit 0bb2386ff5
2 changed files with 10 additions and 1 deletions

View File

@@ -165,8 +165,12 @@ impl<'env> Cursor<'env> {
} }
pub fn get_current(&mut self) -> Result<Option<(Key<'env>, Value<'env>)>, Error> { pub fn get_current(&mut self) -> Result<Option<(Key<'env>, Value<'env>)>, Error> {
// FIXME: lmdb has an extremely broken API which can mutate the SHARED REFERENCE
// `value` after `get_current` is called. We need to convert it to a Vec here in order
// to avoid `value` changing after another cursor operation. I think this represents a bug
// in the LMDB bindings, as shared references should be immutable.
if let Some((Some(key), value)) = self.cursor.get(None, None, MDB_GET_CURRENT).optional()? { if let Some((Some(key), value)) = self.cursor.get(None, None, MDB_GET_CURRENT).optional()? {
Ok(Some((Cow::Borrowed(key), Cow::Borrowed(value)))) Ok(Some((Cow::Borrowed(key), Cow::Owned(value.to_vec()))))
} else { } else {
Ok(None) Ok(None)
} }

View File

@@ -235,3 +235,8 @@ fn no_crash_blocks_example1() {
}, },
); );
} }
#[test]
fn no_crash_aug_24() {
random_test(13519442335106054152, TestConfig::default())
}