summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2016-09-05 19:57:22 +0300
committerEli Zaretskii <eliz@gnu.org>2016-09-05 19:57:22 +0300
commit6acff25280dbb97b5e9ddfd872b33ceb36b0470a (patch)
tree24b7152457c11d14aefdf8952ce7d3500586be05
parentcfaf18a27c262694750400005e882f1cfc7ff2b0 (diff)
Avoid assertion violations when scrolling narrowed buffer
* src/window.c (window_scroll_pixel_based): * src/xdisp.c (pos_visible_p): Don't allow simulated redisplay to start outside the accessible portion of the buffer. This avoids assertion violations when some Lisp narrows the buffer to less than the current window, and then attempts to scroll the buffer.
-rw-r--r--src/window.c5
-rw-r--r--src/xdisp.c5
2 files changed, 6 insertions, 4 deletions
diff --git a/src/window.c b/src/window.c
index 374ef0f838..753ebc16fb 100644
--- a/src/window.c
+++ b/src/window.c
@@ -4813,8 +4813,9 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, bool noerror)
SET_TEXT_POS_FROM_MARKER (start, w->start);
/* Scrolling a minibuffer window via scroll bar when the echo area
shows long text sometimes resets the minibuffer contents behind
- our backs. */
- if (CHARPOS (start) > ZV)
+ our backs. Also, someone might narrow-to-region and immediately
+ call a scroll function. */
+ if (CHARPOS (start) > ZV || CHARPOS (start) < BEGV)
SET_TEXT_POS (start, BEGV, BEGV_BYTE);
/* If PT is not visible in WINDOW, move back one half of
diff --git a/src/xdisp.c b/src/xdisp.c
index dc68cd48e5..d1e884820b 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -1317,8 +1317,9 @@ pos_visible_p (struct window *w, ptrdiff_t charpos, int *x, int *y,
SET_TEXT_POS_FROM_MARKER (top, w->start);
/* Scrolling a minibuffer window via scroll bar when the echo area
shows long text sometimes resets the minibuffer contents behind
- our backs. */
- if (CHARPOS (top) > ZV)
+ our backs. Also, someone might narrow-to-region and immediately
+ call a scroll function. */
+ if (CHARPOS (top) > ZV || CHARPOS (top) < BEGV)
SET_TEXT_POS (top, BEGV, BEGV_BYTE);
/* If the top of the window is after CHARPOS, the latter is surely