Fix an assertion failure in IndexSet::do_add() following a table clear
We don't track insertions and deletions for tables that are merely linked to by tables actually being observed (for performance reasons, since we don't need that information), but the check for that was missing in one place. This would be merely a slowdown rather than a crash, but deletions.add_shifted() can overflow size_t if the passed-in index represents a newly inserted row and the check for that didn't work due to not tracking insertions for the table. The only remotely realistic way to actually have size_t overflow is to have previously cleared the table (the table clear instruction does not include the old size of the table, so it just marks {0, SIZE_T_MAX} as deleted). Fixes #3537.
This commit is contained in:
parent
2bcf42904a
commit
e6d09b513e
|
@ -251,11 +251,13 @@ void CollectionChangeBuilder::move_over(size_t row_ndx, size_t last_row, bool tr
|
|||
REALM_ASSERT(modifications.empty() || prev(modifications.end())->second - 1 <= last_row);
|
||||
|
||||
if (row_ndx == last_row) {
|
||||
auto shifted_from = insertions.erase_or_unshift(row_ndx);
|
||||
if (shifted_from != IndexSet::npos)
|
||||
deletions.add_shifted(shifted_from);
|
||||
if (track_moves) {
|
||||
auto shifted_from = insertions.erase_or_unshift(row_ndx);
|
||||
if (shifted_from != IndexSet::npos)
|
||||
deletions.add_shifted(shifted_from);
|
||||
m_move_mapping.erase(row_ndx);
|
||||
}
|
||||
modifications.remove(row_ndx);
|
||||
m_move_mapping.erase(row_ndx);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue