MLE:a_tty_readline(): FIX possible buffer-overflow with HAVE_KEY_BINDINGS..
authorSteffen Nurpmeso <steffen@sdaoden.eu>
Thu, 18 Mar 2021 00:05:56 +0000 (01:05 +0100)
committerSteffen Nurpmeso <steffen@sdaoden.eu>
Thu, 18 Mar 2021 00:15:55 +0000 (01:15 +0100)
As bytes come in we check whether they could form a key binding,
and we keep on buffering them until either a binding can be
fullfilled, or we know for sure that there is no mapping, in which
case we output the bytes of the binding "as-is".

In the latter case we did not yet check whether the readline
output buffer was of sufficient size.  This never hit me in the
many years since this bug exists, because normally the buffer is
per se very large for one, and we keep on growing it by far too
large.  However, in certain conditions we reuse a buffer from
a former command (more so now with linepool), and if that is
small, and if the resize(s) which happen before the necessary
takeover were not sufficient, a memory violation would occur.
It can be reproduced (back to at least v14.9.11) via

  ..[startup]
  ? coll
  ? h[KEY-WHICH-GENERATES \E[1;2C (or of that size, with no binding)

While here, move an assignment in a_tty_check_grow() to the right
place, which avoids a tremendous amount of resizes.

src/mx/tty-mle.c

index 376067abe991806608d0b3814bb4a6e9fcf1e442..985da0b122769fa8ad755b384e734e069b64b0f0 100644 (file)
@@ -1257,10 +1257,10 @@ a_tty_check_grow(struct a_tty_line *tlp, u32 no  su_DBG_LOC_ARGS_DECL){
          tlp->tl_line.cbuf =
          *tlp->tl_x_buf = su_MEM_REALLOC_LOCOR(*tlp->tl_x_buf, i,
                su_DBG_LOC_ARGS_ORUSE);
+         *tlp->tl_x_bufsize = i;
          mx_sigs_all_rele(); /* XXX v15 drop */
       }
       tlp->tl_count_max = cmax;
-      *tlp->tl_x_bufsize = i;
    }
 
    NYD2_OU;
@@ -3269,9 +3269,12 @@ jmle_fun:
 
          /* We need to take over all the sequence "as is" */
 jtake_over:
+         for(rv = 0, isp = isp_head; isp != NIL; ++rv, isp = isp->next)
+            ;
+         a_tty_check_grow(tlp, rv  su_DBG_LOC_ARGS_USE);
          for(isp = isp_head; isp != NIL; isp = isp->next)
             if(a_tty_kother(tlp, isp->tbtp->tbt_char)){
-               /* FIXME */
+               /* TODO ??? */
             }
 
 # else /* mx_HAVE_KEY_BINDINGS */
This page took 0.065211 seconds and 4 git commands to generate.