Skip to content

Commit e673013

Browse files
btree: fix handling of nodes with a single child node
1 parent 984b2cb commit e673013

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed

idb/fileformat.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ def find_index(self, key):
284284
# the linear scan below is simpler to read, so we'll use that until it becomes an issue.
285285
if self.is_leaf():
286286
for i, entry in enumerate(self.get_entries()):
287-
if key == entry.key:
287+
if key == bytes(entry.key):
288288
return i
289289
else:
290290
for i, entry in enumerate(self.get_entries()):
@@ -365,18 +365,18 @@ def _find(self, cursor, page_number, key):
365365

366366
entry = page.get_entry(entry_number)
367367

368-
if entry.key == key:
368+
if bytes(entry.key) == key:
369369
cursor.entry = entry
370370
cursor.entry_number = entry_number
371371
return
372372
elif page.is_leaf():
373373
# no matches!
374374
raise KeyError(key)
375375
else:
376-
if entry_number == 0:
377-
next_page_number = page.ppointer
378-
elif is_largest:
376+
if is_largest:
379377
next_page_number = page.get_entry(page.entry_count - 1).page
378+
elif entry_number == 0:
379+
next_page_number = page.ppointer
380380
else:
381381
next_page_number = page.get_entry(entry_number - 1).page
382382
self._find(cursor, next_page_number, key)

scripts/explore_btree.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def __init__(self, db):
4343

4444
@property
4545
def prompt(self):
46-
return '/' + '/'.join(map(h, self.path)) + " > "
46+
return '/'.join(map(h, self.path)) + "/ > "
4747

4848
@property
4949
def current_page(self):

tests/test_netnode.py

+7
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,10 @@ def test_sups(kernel32_idb, version, bitness, expected):
4949
def test_alts(kernel32_idb, version, bitness, expected):
5050
root = idb.netnode.Netnode(kernel32_idb, ROOT_NODEID)
5151
assert list(root.alts()) == [-8, -6, -5, -4, -3, -2, -1]
52+
53+
54+
# the small netnode has a root btree node with a single child.
55+
# this is a little tricky to handle, so we ensure it works as expected.
56+
def test_small(small_idb):
57+
root = idb.netnode.Netnode(small_idb, ROOT_NODEID)
58+
assert list(root.alts()) == [-8, -5, -4, -3, -2, -1]

0 commit comments

Comments
 (0)