fix(ui,db): harden NULL handling and resource lifecycle across UI and SQLite
Some checks failed
CI Code / Linux (arch) (pull_request) Failing after 20s
CI Code / Check spelling (pull_request) Successful in 24s
CI Code / Check coding style (pull_request) Failing after 36s
CI Code / Linux (ubuntu) (pull_request) Successful in 15m27s
CI Code / Linux (debian) (pull_request) Successful in 17m51s

ui/window: fix subwindow lifecycle (safe delwin on recreate), clamp widths, add fallback timestamp
when loading history to avoid NULL deref
ui/buffer: add GSList bounds checks; assert non-NULL timestamps when creating entries
ui/titlebar: guard newwin failures; make draw/resize/free no-ops when window is NULL
ui/statusbar: guard window creation/resize/close; clamp columns; fallback display name if JID
parsing fails
ui/inputwin: check newpad result; guard resize/getters/close on NULL; safe delwin
ui/chatwin: guard buffer_get_entry/time before ISO8601 formatting
ui/window_list: validate win_create_* results; don’t insert NULL windows; fix barejid leak in
wins_get_by_string
db/database: ensure cleanup on sqlite init/open failures; use sqlite3_close_v2 and warn if busy;
always return a ProfMessage from log_database_get_limits_info and set current UTC timestamp when
is_last with no row; initialize err_msg and free consistently; improve error messages
Prevents crashes from NULL dereferences (e.g., during MAM history) and closes small leaks; improves
robustness under OOM and allocation failures.
This commit is contained in:
2025-11-05 14:39:10 +03:00
parent 3738be4af1
commit 332cd243c6
8 changed files with 203 additions and 25 deletions

View File

@@ -163,6 +163,10 @@ create_input_window(void)
rl_callback_handler_install(NULL, _inp_rl_linehandler);
inp_win = newpad(1, INP_WIN_MAX);
if (!inp_win) {
// Failed to allocate input pad; leave inp_win NULL and avoid further use
return;
}
wbkgd(inp_win, theme_attrs(THEME_INPUT_TEXT));
keypad(inp_win, TRUE);
wmove(inp_win, 0, 0);
@@ -238,6 +242,9 @@ inp_readline(void)
void
inp_win_resize(void)
{
if (!inp_win) {
return;
}
int col = getcurx(inp_win);
int wcols = getmaxx(stdscr);
@@ -285,8 +292,10 @@ void
inp_close(void)
{
rl_callback_handler_remove();
delwin(inp_win);
inp_win = NULL;
if (inp_win) {
delwin(inp_win);
inp_win = NULL;
}
fclose(discard);
discard = NULL;
}
@@ -294,6 +303,9 @@ inp_close(void)
char*
inp_get_line(void)
{
if (!inp_win) {
return NULL;
}
werase(inp_win);
wmove(inp_win, 0, 0);
_inp_win_update_virtual();
@@ -318,6 +330,9 @@ inp_set_line(const char* const new_line)
char*
inp_get_password(void)
{
if (!inp_win) {
return NULL;
}
werase(inp_win);
wmove(inp_win, 0, 0);
_inp_win_update_virtual();