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:
Thomas Waldmann 2026-02-18 22:40:22 +01:00
parent b1aa1a4eb0
commit 2e6af653f6
No known key found for this signature in database
GPG key ID: 243ACFA951F78E01
2 changed files with 34 additions and 4 deletions

View file

@ -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

View 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))