Skip to content

Commit b4521f9

Browse files
cmikkreedjc
authored andcommitted
Fix mtbl_iter_seek() to a key beyond the end of an mtbl file.
1 parent 491e4ff commit b4521f9

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

mtbl/reader.c

+5-2
Original file line numberDiff line numberDiff line change
@@ -415,10 +415,13 @@ reader_iter_seek(void *v,
415415

416416
block_iter_seek(it->index_iter, key, len_key);
417417

418-
if (block_iter_get(it->index_iter, &ikey, &len_ikey, &ival, &len_ival)) {
419-
mtbl_varint_decode64(ival, &new_offset);
418+
if (!block_iter_get(it->index_iter, &ikey, &len_ikey, &ival, &len_ival)) {
419+
it->valid = false;
420+
return (mtbl_res_success);
420421
}
421422

423+
mtbl_varint_decode64(ival, &new_offset);
424+
422425
/* We can skip decoding a new block if our new key is within the
423426
* currently-decoded block. */
424427
if (it->b == NULL || it->block_offset != new_offset) {

t/test-iter-seek.c

+9
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,15 @@ test_iter(struct mtbl_iter *iter)
153153

154154
ubuf_destroy(&seek_key);
155155
}
156+
157+
/* Attempt to seek past end of iterator */
158+
ubuf *seek_key = ubuf_init(1);
159+
const uint8_t *key, *value;
160+
size_t len_key, len_value;
161+
162+
ubuf_add_fmt(seek_key, KEY_FMT, NUM_KEYS + 1);
163+
assert(mtbl_iter_seek(iter, ubuf_data(seek_key), ubuf_size(seek_key)) == mtbl_res_success);
164+
assert(mtbl_iter_next(iter, &key, &len_key, &value, &len_value) == mtbl_res_failure);
156165
}
157166

158167
static void

0 commit comments

Comments
 (0)