diff options
| author | Mark Rowe <mark@vector35.com> | 2026-03-18 22:58:20 -0700 |
|---|---|---|
| committer | Mark Rowe <mark@vector35.com> | 2026-03-19 08:43:51 -0700 |
| commit | cbc66f931da1046b3980c2c7c6b64c2f2ac358e2 (patch) | |
| tree | 3483e6c6d37ab18c7698c5148e61f6a715a6472c /highlevelilinstruction.cpp | |
| parent | eeceddfaf7c8d2ef4a9feed5dc2abb1dcc498b76 (diff) | |
Fix operand list iterators being validated when appending new instructions
The iterators now store an offset into the operand storage, rather than
a pointer. Deferencing the iterator retrieves the value at that offset
from the IL function.
This issue existed prior to the operand list storage refactor, but
became easier to hit after that change. The separate operand list vector
is smaller and thus more likely to reallocate when a new instruction is
appended.
Diffstat (limited to 'highlevelilinstruction.cpp')
| -rw-r--r-- | highlevelilinstruction.cpp | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/highlevelilinstruction.cpp b/highlevelilinstruction.cpp index ad8f416d..7f4bad39 100644 --- a/highlevelilinstruction.cpp +++ b/highlevelilinstruction.cpp @@ -288,14 +288,18 @@ bool HighLevelILIntegerList::ListIterator::operator<(const ListIterator& a) cons HighLevelILIntegerList::ListIterator& HighLevelILIntegerList::ListIterator::operator++() { count--; - cur++; + offset++; return *this; } uint64_t HighLevelILIntegerList::ListIterator::operator*() { - return *cur; +#ifdef BINARYNINJACORE_LIBRARY + return function->GetOperand(offset); +#else + return BNHighLevelILGetOperand(function->GetObject(), offset); +#endif } @@ -303,11 +307,7 @@ HighLevelILIntegerList::HighLevelILIntegerList( HighLevelILFunction* func, size_t offset, size_t count) { m_start.function = func; -#ifdef BINARYNINJACORE_LIBRARY - m_start.cur = func->GetOperandPointer(offset); -#else - m_start.cur = BNHighLevelILGetOperandPointer(func->GetObject(), offset); -#endif + m_start.offset = offset; m_start.count = count; } @@ -322,7 +322,7 @@ HighLevelILIntegerList::const_iterator HighLevelILIntegerList::end() const { const_iterator result; result.function = m_start.function; - result.cur = m_start.cur + m_start.count; + result.offset = m_start.offset + m_start.count; result.count = 0; return result; } @@ -338,7 +338,11 @@ uint64_t HighLevelILIntegerList::operator[](size_t i) const { if (i >= size()) throw HighLevelILInstructionAccessException(); - return m_start.cur[i]; +#ifdef BINARYNINJACORE_LIBRARY + return m_start.function->GetOperand(m_start.offset + i); +#else + return BNHighLevelILGetOperand(m_start.function->GetObject(), m_start.offset + i); +#endif } |
