summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEgmont Koblinger <egmont@gmail.com>2019-10-11 12:47:15 +0200
committerEgmont Koblinger <egmont@gmail.com>2019-10-11 12:54:03 +0200
commit73a890ed0d725331314d2fc0ac12583e8051e77b (patch)
treee9d4432152b520fcf5893ffc3361c30b63fcf0e1
parentc3c2c6bc29c6cbd294e4fa20038264f5d29b7144 (diff)
downloadvte-0.56.4.tar.gz
ring: Fix an incorrect assertion0.56.4
An assertion in the rewrap code incorrectly assumed that the last line of the ring is always hard wrapped (i.e. ends in an explicit newline). Rewrapping when the last line is soft wrapped and the cursor stands here after the last nonempty cell resulted in a crash. https://gitlab.gnome.org/GNOME/vte/issues/181 (cherry picked from commit a6cb948d2c352056b79e04efd372f88f84b8e0a1)
-rw-r--r--src/ring.cc12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/ring.cc b/src/ring.cc
index 731b1bc2..a1ef059f 100644
--- a/src/ring.cc
+++ b/src/ring.cc
@@ -1067,9 +1067,6 @@ Ring::frozen_row_text_offset_to_column(row_t position,
} else
records[1].text_start_offset = _vte_stream_head (m_text_stream);
- g_assert_cmpuint(offset->text_offset, >=, records[0].text_start_offset);
- g_assert_cmpuint(offset->text_offset, <, records[1].text_start_offset);
-
g_string_set_size (buffer, records[1].text_start_offset - records[0].text_start_offset);
if (!_vte_stream_read(m_text_stream, records[0].text_start_offset, buffer->str, buffer->len))
return false;
@@ -1077,6 +1074,13 @@ Ring::frozen_row_text_offset_to_column(row_t position,
if (G_LIKELY (buffer->len && buffer->str[buffer->len - 1] == '\n'))
buffer->len--;
+ /* Now that we've chopped off the likely trailing newline (which is only rarely missing,
+ * if the ring ends in a soft wrapped line; see bug 181), the position we're about to
+ * locate can be anywhere in the string, including just after its last character,
+ * but not beyond that. */
+ g_assert_cmpuint(offset->text_offset, >=, records[0].text_start_offset);
+ g_assert_cmpuint(offset->text_offset, <=, records[0].text_start_offset + buffer->len);
+
row = index(position);
/* row and buffer now contain the same text, in different representation */
@@ -1084,7 +1088,7 @@ Ring::frozen_row_text_offset_to_column(row_t position,
/* count the number of characters for the given UTF-8 text offset */
off = offset->text_offset - records[0].text_start_offset;
num_chars = 0;
- for (i = 0; i < off && i < buffer->len; i++) {
+ for (i = 0; i < off; i++) {
if ((buffer->str[i] & 0xC0) != 0x80) num_chars++;
}