term: scrolling: hopefully fix all selection/scrolling related crashes

When scrolling, there are a couple of cases where an existing
selection must be canceled because we cannot meaningfully represent it
after scrolling.

These are when the selection is (partly) inside:

* The top scrolling region
* The bottom scrolling region
* The new lines scrolled in. I.e. re-used lines

For the scrolling regions, the real problem is when the selection
crosses the scrolling region boundary; a selection that is completely
inside a scrolling regions _might_ be possible to keep, but we would
need to translate the selection coordinates to the new scrolling
region lines.

For simplicity, we cancel the selection if it touches the scrolling
region. Period.

The last item, newly scrolled in lines is when the selection covers
very old lines and we're now wrapping around the scrollback history.

Then there's a fourth problem case: when the user has started a
selection, but hasn't yet moved the cursor. In this case, we have no
end point.

What's more problematic is that when the user (after scrolling) moves
the cursor, we try to create a huge selection that covers mostly
empty (NULL) rows, causing us to crash.

This can happen e.g. when reverse scrolling in such a way that we wrap
around the scrollback history.

The actual viewport in this case is something like `-n - m`. But the
selection we'll end up trying to create will be `m - (rows - n)`. This
range may very well contain NULL rows.

To deal with this, we simply cancel the selection.
This commit is contained in:
Daniel Eklöf 2020-05-17 15:34:49 +02:00
parent 5d643e63fe
commit 96a4f1b993
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
4 changed files with 89 additions and 17 deletions

View file

@ -36,6 +36,8 @@
when the mouse button is released - not as soon as `shift` is
released.
* Selected cells did not appear selected if modified.
* Very rare crash when beginning a selection at the same time the
terminal content was scrolled.
### Security