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] == ' ') {