AmendHub

Download (as of this amendment):

jcs

/

subtext

/

amendments

/

633

session: Fix some corner cases in input handling


jcs made amendment 633 about 1 month ago
--- session.c Thu Sep 17 22:01:43 2026 +++ session.c Fri Sep 18 22:03:25 2026 @@ -653,10 +653,12 @@ session_paginate(struct session *session, const char * size_t olen = 0, n, adv; size_t olines = first_page_printed; size_t line_len = session->terminal_columns; - ssize_t last_space = -1; + ssize_t last_space; short last_input = 0; while (len && !session->ending) { + last_space = -1; + for (n = 0, adv = 0; n < line_len && n < len; n++) { if (str[n] == '\r') { last_space = n; @@ -969,7 +971,7 @@ done_consuming: else { memmove(session->ibuf, session->ibuf + consumed, session->ibuflen - consumed); - session->ibuflen--; + session->ibuflen -= consumed; } if (session->last_input == '\r' && (ret == '\n' || ret == 0)) { @@ -1002,6 +1004,7 @@ session_clear_input(struct session *session) session->node_funcs->input(session); session->ibuflen = 0; + session->ibufoff = 0; } /* @@ -1029,7 +1032,8 @@ session_field_input(struct session *session, unsigned } if (initial_input) { - ipos = ilen = strlcpy(field, initial_input, size); + strlcpy(field, initial_input, size); + ipos = ilen = strlen(field); /* TODO: handle initial value being longer than width */ if (mask) { for (n = 0; n < ilen; n++) @@ -1066,7 +1070,7 @@ session_field_input(struct session *session, unsigned if (ipos < ilen && c != KEY_LEFT) { redraw = true; - memmove(field + ipos - 1, field + ipos, ilen - 1); + memmove(field + ipos - 1, field + ipos, ilen - ipos); } if (field[ipos - 1] == '\n') { @@ -1447,8 +1451,8 @@ session_expand_var(struct session *session, char *ivar if (sscanf(ivar, "%127[^|]|%lu%n", &var, &retsize, &count) == 2 && count > 0) { /* field of fixed length, either truncated or padded */ - if (retsize > sizeof(retval)) - retsize = sizeof(retval); + if (retsize >= sizeof(retval)) + retsize = sizeof(retval) - 1; pad = true; varlen = strlen(var); } else { @@ -1456,7 +1460,7 @@ session_expand_var(struct session *session, char *ivar ivar++; varlen = strlcpy(var, ivar, sizeof(var)); - retsize = sizeof(retval); + retsize = sizeof(retval) - 1; } while (varlen && var[varlen - 1] == ' ') {