diff options
author | Oleksandr Anyshchenko <aanischenko@gmail.com> | 2023-10-26 10:18:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-26 10:18:05 +0100 |
commit | 4b8a2ce57e9c4b745784fa3d023c8e3b4ab3a83c (patch) | |
tree | c20c5b21ef7a6572e042f00cb302f63579fdee09 | |
parent | 266571ec5793dc4ab5b524f7fed7c91519aa0fe5 (diff) |
fix: add raw iterator validation before calling next method (#829)
-rw-r--r-- | src/db_iterator.rs | 12 | ||||
-rw-r--r-- | tests/test_raw_iterator.rs | 14 |
2 files changed, 22 insertions, 4 deletions
diff --git a/src/db_iterator.rs b/src/db_iterator.rs index 51b00ab..a1b66fa 100644 --- a/src/db_iterator.rs +++ b/src/db_iterator.rs @@ -289,15 +289,19 @@ impl<'a, D: DBAccess> DBRawIteratorWithThreadMode<'a, D> { /// Seeks to the next key. pub fn next(&mut self) { - unsafe { - ffi::rocksdb_iter_next(self.inner.as_ptr()); + if self.valid() { + unsafe { + ffi::rocksdb_iter_next(self.inner.as_ptr()); + } } } /// Seeks to the previous key. pub fn prev(&mut self) { - unsafe { - ffi::rocksdb_iter_prev(self.inner.as_ptr()); + if self.valid() { + unsafe { + ffi::rocksdb_iter_prev(self.inner.as_ptr()); + } } } diff --git a/tests/test_raw_iterator.rs b/tests/test_raw_iterator.rs index 311ad23..442958f 100644 --- a/tests/test_raw_iterator.rs +++ b/tests/test_raw_iterator.rs @@ -136,3 +136,17 @@ pub fn test_seek_for_prev() { assert_item(&iter, b"k2", b"v2"); } } + +#[test] +pub fn test_next_without_seek() { + let n = DBPath::new("test_forgot_seek"); + { + let db = DB::open_default(&n).unwrap(); + db.put(b"k1", b"v1").unwrap(); + db.put(b"k2", b"v2").unwrap(); + db.put(b"k4", b"v4").unwrap(); + + let mut iter = db.raw_iterator(); + iter.next(); + } +} |