mwindow: make sure the whole range is contained inside the same window

Looking through the open windows to check whether we can re-use an
open window should take into account whether both `offset` and `offset
+ extra` are contained within the same window. Failure to do so can
lead to invalid memory accesses. This closes #614.

While we're in the area remove an outdated assert.
This commit is contained in:
Carlos Martín Nieto 2012-04-04 16:21:52 +02:00
parent bbb3723657
commit 31e80290a1

View File

@ -211,13 +211,15 @@ unsigned char *git_mwindow_open(
git_mwindow_ctl *ctl = &GIT_GLOBAL->mem_ctl;
git_mwindow *w = *cursor;
if (!w || !git_mwindow_contains(w, offset + extra)) {
if (!w || !(git_mwindow_contains(w, offset) &&
git_mwindow_contains(w, offset + extra))) {
if (w) {
w->inuse_cnt--;
}
for (w = mwf->windows; w; w = w->next) {
if (git_mwindow_contains(w, offset + extra))
if (git_mwindow_contains(w, offset) &&
git_mwindow_contains(w, offset + extra))
break;
}
@ -242,7 +244,6 @@ unsigned char *git_mwindow_open(
}
offset -= w->offset;
assert(git__is_sizet(offset));
if (left)
*left = (unsigned int)(w->window_map.len - offset);