mirror of
https://github.com/borgbackup/borg.git
synced 2026-06-10 17:32:13 -04:00
hashindex: fixed iteritems segfaulting with non-existent marker, fixes #9368
Never happened in borg, because borg always gives existing markers to iteritems. Also: added test for this.
This commit is contained in:
parent
b1aa1a4eb0
commit
2e6af653f6
2 changed files with 34 additions and 4 deletions
|
|
@ -237,8 +237,8 @@ cdef class NSIndex(IndexBase):
|
|||
iter.index = self.index
|
||||
if marker:
|
||||
key = hashindex_get(self.index, <unsigned char *>marker)
|
||||
if marker is None:
|
||||
raise IndexError
|
||||
if not key:
|
||||
raise KeyError("marker not found")
|
||||
iter.key = key - self.key_size
|
||||
return iter
|
||||
|
||||
|
|
@ -354,8 +354,8 @@ cdef class ChunkIndex(IndexBase):
|
|||
iter.index = self.index
|
||||
if marker:
|
||||
key = hashindex_get(self.index, <unsigned char *>marker)
|
||||
if marker is None:
|
||||
raise IndexError
|
||||
if not key:
|
||||
raise KeyError("marker not found")
|
||||
iter.key = key - self.key_size
|
||||
return iter
|
||||
|
||||
|
|
|
|||
30
src/borg/testsuite/hashindex_pytest.py
Normal file
30
src/borg/testsuite/hashindex_pytest.py
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
import pytest
|
||||
from borg.hashindex import NSIndex, ChunkIndex
|
||||
|
||||
def test_nsindex_iteritems_marker():
|
||||
nsindex = NSIndex()
|
||||
nsindex[b'\xbb'*32] = (123, 456)
|
||||
nsindex[b'\xaa'*32] = (234, 567)
|
||||
|
||||
# marker exists
|
||||
items = list(nsindex.iteritems(marker=b'\xbb'*32))
|
||||
assert len(items) == 1
|
||||
assert items[0][0] == b'\xaa'*32
|
||||
|
||||
# marker does not exist
|
||||
with pytest.raises(KeyError, match="marker not found"):
|
||||
list(nsindex.iteritems(marker=b'\xcc'*32))
|
||||
|
||||
def test_chunkindex_iteritems_marker():
|
||||
chunkindex = ChunkIndex()
|
||||
chunkindex[b'\xbb'*32] = (1, 100, 50)
|
||||
chunkindex[b'\xaa'*32] = (1, 200, 100)
|
||||
|
||||
# marker exists
|
||||
items = list(chunkindex.iteritems(marker=b'\xbb'*32))
|
||||
assert len(items) == 1
|
||||
assert items[0][0] == b'\xaa'*32
|
||||
|
||||
# marker does not exist
|
||||
with pytest.raises(KeyError, match="marker not found"):
|
||||
list(chunkindex.iteritems(marker=b'\xcc'*32))
|
||||
Loading…
Reference in a new issue