AmendHub

Download:

jcs

/

subtext

/

amendments

/

645

session: Minor bug fixes


jcs made amendment 645 1 day ago
--- session.c Fri Sep 18 22:14:30 2026 +++ session.c Tue Sep 22 15:23:05 2026 @@ -367,6 +367,11 @@ get_another_char: } break; case ACTION_SIGNUP: + if (!db->config.open_signup) { + session_printf(s, "New user signup is not available.\r\n"); + session_flush(s); + break; + } s->area = SESSION_AREA_SIGNUP; if ((s->user = signup(s))) goto main_menu; @@ -663,7 +668,7 @@ session_paginate(struct session *session, const char * if (str[n] == '\r') { last_space = n; adv = n + 1; - if (str[n + 1] == '\n') + if (n + 1 < len && str[n + 1] == '\n') adv++; break; } else if (str[n] == '\n') { @@ -821,12 +826,12 @@ session_idled_out(struct session *session) if (session->user && session->user->is_sysop) { if (db->config.max_sysop_idle_minutes != 0 && Time - session->last_input_at > - (db->config.max_sysop_idle_minutes * 60)) + ((unsigned long)db->config.max_sysop_idle_minutes * 60)) return true; } else { if (db->config.max_idle_minutes != 0 && Time - session->last_input_at > - (db->config.max_idle_minutes * 60)) + ((unsigned long)db->config.max_idle_minutes * 60)) return true; } } else { @@ -852,15 +857,15 @@ session_get_chars(struct session *session, unsigned ch while (ret < count) { if (session->ibuflen == 0) { if (session_idled_out(session)) - return 0; + break; uthread_yield(); session->node_funcs->input(session); if (session->ending || session->abort_input) - return 0; + break; if (session->ibuflen == 0) - return 0; + break; } session->last_input_at = Time; @@ -1283,11 +1288,13 @@ session_login(struct session *s) session_printf(s, "Login incorrect\r\n"); session_flush(s); - if (user) + if (user != NULL) xfree(&user); } login_bail: + if (user != NULL) + xfree(&user); if (username != NULL) xfree(&username); if (password != NULL) @@ -1339,14 +1346,16 @@ session_expand_template(struct session *session, const n++; } else if (tmpl[n] == '\r' && tmpl[n + 1] != '\n') { if (!grow_to_fit(&data, &retsize, retpos, 3, 64)) { - xfree(&data); + if (data != NULL) + xfree(&data); break; } data[retpos++] = '\r'; data[retpos++] = '\n'; } else { if (!grow_to_fit(&data, &retsize, retpos, 2, 64)) { - xfree(&data); + if (data != NULL) + xfree(&data); break; } data[retpos++] = tmpl[n]; @@ -1416,7 +1425,8 @@ expand_var: if (vallen) { if (!grow_to_fit(&data, &retsize, retpos, vallen + 1, 128)) { - xfree(&data); + if (data != NULL) + xfree(&data); break; } memcpy(data + retpos, val, vallen); @@ -1442,7 +1452,7 @@ session_expand_var(struct session *session, char *ivar size_t retsize, retlen, varlen, unread_count; long elapsed, telapsed; struct tm *now; - short count, n; + short count, len, n; bool pad = false; *ret = (char *)&retval; @@ -1492,24 +1502,29 @@ session_expand_var(struct session *session, char *ivar while (elapsed > 0) { if (elapsed < 60) { telapsed = elapsed; - retlen += snprintf(retval + retlen, - retsize - retlen, "%lus", telapsed); + len = snprintf(retval + retlen, retsize - retlen, + "%lus", telapsed); } else if (elapsed < (60 * 60)) { telapsed = elapsed / 60; - retlen += snprintf(retval + retlen, - retsize - retlen, "%lum", telapsed); + len = snprintf(retval + retlen, retsize - retlen, + "%lum", telapsed); telapsed *= 60; } else if (elapsed < (60 * 60 * 24)) { telapsed = elapsed / (60 * 60); - retlen += snprintf(retval + retlen, - retsize - retlen, "%luh", telapsed); + len = snprintf(retval + retlen, retsize - retlen, + "%luh", telapsed); telapsed *= (60 * 60); } else { telapsed = elapsed / (60 * 60 * 24); - retlen += snprintf(retval + retlen, - retsize - retlen, "%luh", telapsed); + len = snprintf(retval + retlen, retsize - retlen, + "%lud", telapsed); telapsed *= (60 * 60 * 24); } + if (retlen + len >= retsize) { + retval[retlen] = '\0'; + break; + } + retlen += len; elapsed -= telapsed; } } else if (strcmp(var, "node") == 0) { @@ -1533,18 +1548,26 @@ session_expand_var(struct session *session, char *ivar } } else if (var[0] == '"') { /* a literal string, remove leading and trailing quotes */ - var[varlen - 1] = '\0'; - varlen--; - if (varlen > retsize) - varlen = retsize; - strlcpy(retval, var + 1, varlen); - retlen = varlen - 1; + if (varlen > 2) + retlen = 0; + else { + var[varlen - 1] = '\0'; + varlen--; + if (varlen > retsize) + varlen = retsize; + strlcpy(retval, var + 1, varlen); + retlen = varlen - 1; + } } else { /* shrug */ - strlcpy(retval, var, varlen); - retlen = varlen; + retlen = strlcpy(retval, var, retsize); } + if (retsize == 0) + retlen = 0; + else if (retlen >= retsize) + retlen = retsize - 1; + if (pad && retlen < retsize) { while (retlen < retsize) retval[retlen++] = ' '; @@ -1926,8 +1949,10 @@ session_prune_logs(short days) delta = Time - log.logged_on_at; if (delta > secs) { if (!grow_to_fit(&ids, &size, count * sizeof(unsigned long), - sizeof(unsigned long), 10 * sizeof(unsigned long))) + sizeof(unsigned long), 10 * sizeof(unsigned long))) { + xfree(&obj); break; + } ids[count++] = obj->id; }