Skip to content

cext-revlog: fixed __delitem__ for uninitialized nodetree

This is a bug in a code path that's seldom used, because in practice (at least in the whole test suite), calls to del index[i:j] currently just don't happen before the nodetree has been initialized. However, in our current work to replace the nodetree by a Rust implementation, this is of course systematic.

In index_slice_del(), if the slice start is smaller than self->length, the whole of self->added has to be cleared.

Before this change, the clearing was done only by the call to index_invalidate_added(self, 0), that happens only for initialized nodetrees. Hence the removal was effective only from start to self->length.

The consequence is index corruption, with bogus results in subsequent calls, and in particular errors such as ValueError("parent out of range"), due to the fact that parents of entries in self->added are now just invalid.

This is detected by the rebase tests, under conditions that the nodetree of revlog.c is never initialized. The provided specific test is more direct.

Merge request reports