summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Anyshchenko <aanischenko@gmail.com>2023-10-26 10:18:05 +0100
committerGitHub <noreply@github.com>2023-10-26 10:18:05 +0100
commit4b8a2ce57e9c4b745784fa3d023c8e3b4ab3a83c (patch)
treec20c5b21ef7a6572e042f00cb302f63579fdee09
parent266571ec5793dc4ab5b524f7fed7c91519aa0fe5 (diff)
fix: add raw iterator validation before calling next method (#829)
-rw-r--r--src/db_iterator.rs12
-rw-r--r--tests/test_raw_iterator.rs14
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();
+ }
+}