Commit b7440da3 authored by Egmont Koblinger's avatar Egmont Koblinger

ring: Fix an incorrect assertion

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.

#181
(cherry picked from commit a6cb948d)
parent af0d0397
......@@ -1096,9 +1096,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;
......@@ -1106,6 +1103,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 */
......@@ -1113,7 +1117,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++;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment