From bc7af6015676aee9d14c2c4dd522c484c4551d2a Mon Sep 17 00:00:00 2001
From: Jason Crain <jason@inspiresomeone.us>
Date: Sun, 26 Mar 2017 13:33:29 -0500
Subject: a11y: Return correct start and end offsets

This modifies ev_page_accessible_get_range_for_boundary to ensure that
the start and end offsets it returns are within the allowed range.

https://bugzilla.gnome.org/show_bug.cgi?id=777992

origin commit:
https://git.gnome.org/browse/evince/commit/?id=e95a4e3
---
 libview/ev-page-accessible.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/libview/ev-page-accessible.c b/libview/ev-page-accessible.c
index 13ce8b0d..8d07a31c 100644
--- a/libview/ev-page-accessible.c
+++ b/libview/ev-page-accessible.c
@@ -543,23 +543,26 @@ ev_page_accessible_get_range_for_boundary (AtkText          *text,
 	if (!log_attrs)
 		return;
 
+	if (offset < 0 || offset >= n_attrs)
+		return;
+
 	switch (boundary_type) {
 	case ATK_TEXT_BOUNDARY_CHAR:
 		start = offset;
 		end = offset + 1;
 		break;
 	case ATK_TEXT_BOUNDARY_WORD_START:
-		for (start = offset; start >= 0 && !log_attrs[start].is_word_start; start--);
-		for (end = offset + 1; end <= n_attrs && !log_attrs[end].is_word_start; end++);
+		for (start = offset; start > 0 && !log_attrs[start].is_word_start; start--);
+		for (end = offset + 1; end < n_attrs && !log_attrs[end].is_word_start; end++);
 		break;
 	case ATK_TEXT_BOUNDARY_SENTENCE_START:
-		for (start = offset; start >= 0; start--) {
+		for (start = offset; start > 0; start--) {
 			if (log_attrs[start].is_mandatory_break && treat_as_soft_return (view, self->priv->page, log_attrs, start - 1))
 				continue;
 			if (log_attrs[start].is_sentence_start)
 				break;
 		}
-		for (end = offset + 1; end <= n_attrs; end++) {
+		for (end = offset + 1; end < n_attrs; end++) {
 			if (log_attrs[end].is_mandatory_break && treat_as_soft_return (view, self->priv->page, log_attrs, end - 1))
 				continue;
 			if (log_attrs[end].is_sentence_start)
@@ -567,8 +570,8 @@ ev_page_accessible_get_range_for_boundary (AtkText          *text,
 		}
 		break;
 	case ATK_TEXT_BOUNDARY_LINE_START:
-		for (start = offset; start >= 0 && !log_attrs[start].is_mandatory_break; start--);
-		for (end = offset + 1; end <= n_attrs && !log_attrs[end].is_mandatory_break; end++);
+		for (start = offset; start > 0 && !log_attrs[start].is_mandatory_break; start--);
+		for (end = offset + 1; end < n_attrs && !log_attrs[end].is_mandatory_break; end++);
 		break;
 	default:
 		/* The "END" boundary types are deprecated */
-- 
cgit v1.2.1