raster pushed a commit to branch master.

http://git.enlightenment.org/apps/terminology.git/commit/?id=5ccf988abfa638f7898c4da446ceeb48321d7d27

commit 5ccf988abfa638f7898c4da446ceeb48321d7d27
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Tue Aug 20 15:37:54 2019 +0100

    selections - live within scrollback bounds per line
    
    dont access out of range on scrollback lines
    @fix
    
    there is still an issue of the selection just being in the wrong place
    when selecting from the backlog lines as opposed to on-screen lines. i
    see the start/end selection points being... weird. but this at least
    stops crashes.
---
 src/bin/termiointernals.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/bin/termiointernals.c b/src/bin/termiointernals.c
index 322c70f..99169f9 100644
--- a/src/bin/termiointernals.c
+++ b/src/bin/termiointernals.c
@@ -21,6 +21,8 @@ termio_selection_get(Termio *sd,
 {
    int x, y;
 
+   if (c1x < 0) c1x = 0;
+   if (c2x < 0) c2x = 0;
    termpty_backlog_lock();
    for (y = c1y; y <= c2y; y++)
      {
@@ -46,6 +48,8 @@ termio_selection_get(Termio *sd,
           }
         start_x = c1x;
         end_x = (c2x >= w) ? w - 1 : c2x;
+        if (start_x >= w) start_x = w - 1;
+        if (end_x >= w) end_x = w - 1;
         if (c1y != c2y)
           {
              if (y == c1y) end_x = w - 1;
@@ -213,6 +217,8 @@ _sel_codepoints_get(const Termio *sd,
        }                               \
 } while (0)
 
+   if (c1x < 0) c1x = 0;
+   if (c2x < 0) c2x = 0;
    termpty_backlog_lock();
    for (y = c1y; y <= c2y; y++)
      {
@@ -328,6 +334,8 @@ termio_internal_get_selection(Termio *sd, size_t *lenp)
         start_y = sd->pty->selection.start.y;
         end_x = sd->pty->selection.end.x;
         end_y = sd->pty->selection.end.y;
+        if (start_x < 0) start_x = 0;
+        if (end_x < 0) end_x = 0;
 
         if (!sd->pty->selection.is_top_to_bottom)
           {
@@ -787,6 +795,7 @@ _trim_sel_word(Termio *sd)
         if (!cells)
           return;
 
+        if (start >= w) start = w - 1;
         while (start < w && _to_trim(cells[start].codepoint, EINA_TRUE))
           start++;
 
@@ -816,6 +825,7 @@ _trim_sel_word(Termio *sd)
         if (!cells)
           return;
 
+        if (end >= w) end = w - 1;
         while (end >= 0 && _to_trim(cells[end].codepoint, EINA_FALSE))
           end--;
 
@@ -874,10 +884,7 @@ _sel_word(Termio *sd, int cx, int cy)
      {
         goto end;
      }
-   if (x >= w)
-     {
-        x = w - 1;
-     }
+   if (x >= w) x = w - 1;
 
    /* To the left and up */
    do
@@ -930,6 +937,7 @@ _sel_word(Termio *sd, int cx, int cy)
           }
      }
    x = cx;
+   if (x >= w) x = w - 1;
 
    /* To the right and down */
    do
@@ -1328,6 +1336,8 @@ termio_selection_dbl_fix(Termio *sd)
 
    termpty_backlog_lock();
    cells = termpty_cellrow_get(sd->pty, end_y - sd->scroll, &w);
+   if (start_x >= w) start_x = w - 1;
+   if (end_x >= w) end_x = w - 1;
    if (cells)
      {
         // if sel2 after sel1
@@ -1354,6 +1364,8 @@ termio_selection_dbl_fix(Termio *sd)
           }
      }
    cells = termpty_cellrow_get(sd->pty, start_y - sd->scroll, &w);
+   if (start_x >= w) start_x = w - 1;
+   if (end_x >= w) end_x = w - 1;
    if (cells)
      {
         // if sel2 after sel1

-- 


Reply via email to