From 550667a9ea9edcec3071a1d7ec7c868aa7c791ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 19 May 2020 18:47:38 +0200 Subject: [PATCH] term: scrolling: calling function must clamp scroll amount --- csi.c | 16 ++++++++++++---- terminal.c | 8 ++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/csi.c b/csi.c index eb188656..56346e6e 100644 --- a/csi.c +++ b/csi.c @@ -650,13 +650,21 @@ csi_dispatch(struct terminal *term, uint8_t final) break; } - case 'S': - term_scroll(term, vt_param_get(term, 0, 1)); + case 'S': { + int amount = min( + vt_param_get(term, 0, 1), + term->scroll_region.end - term->scroll_region.start); + term_scroll(term, amount); break; + } - case 'T': - term_scroll_reverse(term, vt_param_get(term, 0, 1)); + case 'T': { + int amount = min( + vt_param_get(term, 0, 1), + term->scroll_region.end - term->scroll_region.start); + term_scroll_reverse(term, amount); break; + } case 'X': { /* Erase chars */ diff --git a/terminal.c b/terminal.c index 2bb94338..5dd29aa0 100644 --- a/terminal.c +++ b/terminal.c @@ -1744,8 +1744,8 @@ term_scroll_partial(struct terminal *term, struct scroll_region region, int rows LOG_DBG("scroll: rows=%d, region.start=%d, region.end=%d", rows, region.start, region.end); - /* Clamp scroll amount */ - rows = min(rows, region.end - region.start); + /* Verify scroll amount has been clamped */ + assert(rows <= region.end - region.start); /* Cancel selections that cannot be scrolled */ if (unlikely(term->selection.start.row != -1)) { @@ -1816,8 +1816,8 @@ term_scroll_reverse_partial(struct terminal *term, LOG_DBG("scroll reverse: rows=%d, region.start=%d, region.end=%d", rows, region.start, region.end); - /* Clamp scroll amount */ - rows = min(rows, region.end - region.start); + /* Verify scroll amount has been clamped */ + assert(rows <= region.end - region.start); /* Cancel selections that cannot be scrolled */ if (unlikely(term->selection.start.row != -1)) {