refactor: optimize hash table iterations and fix security issues #58
Some checks failed
CI Code / Check coding style (pull_request) Successful in 38s
CI API Docs / Test Python API Documentation Generation (pull_request) Has been cancelled
CI API Docs / Test C API Documentation Generation (pull_request) Has been cancelled
CI Code / Check spelling (pull_request) Successful in 49s
CI Code / Linux (ubuntu) (pull_request) Successful in 6m22s
CI Code / Linux (debian) (pull_request) Successful in 9m3s
CI Code / Code Coverage (pull_request) Successful in 9m16s
CI Code / Linux (arch) (pull_request) Successful in 11m20s

- refactor(core): replace g_hash_table_get_keys with g_hash_table_iter_init
  * Eliminates temporary GList allocations
  * Improves iteration performance
  * Affected: connection.c, cmd_defs.c, cmd_funcs.c, omemo.c, gpg.c,
    disco.c, form.c, autocompleters.c, capabilities.c, callbacks.c

- fix(xmpp): correct queued_messages loop in connection.c:1031
  * Remove incorrect NULL check that prevented message storage
  * calloc zeros array, causing loop to skip immediately
  * Fixes dropped messages during reconnection with SM enabled

- fix(ui): prevent format string vulnerabilities in cons_show calls
  * Replace cons_show(variable) with cons_show("%s", variable)
  * Protects against format string attacks if variables contain %
  * Updated instances across cmd_funcs.c, connection.c, ox.c,
    console.c, core.c
This commit is contained in:
2025-11-10 18:51:16 +03:00
parent b2ce06923e
commit 58dd89be40
13 changed files with 143 additions and 177 deletions

View File

@@ -141,18 +141,16 @@ autocompleters_complete(const char* const input, gboolean previous)
while (curr_hash) {
GHashTable* key_to_ac = curr_hash->data;
GList* keys = g_hash_table_get_keys(key_to_ac);
GList* curr = keys;
while (curr) {
result = autocomplete_param_with_ac(input, curr->data, g_hash_table_lookup(key_to_ac, curr->data), TRUE, previous);
GHashTableIter iter;
gpointer key, value;
g_hash_table_iter_init(&iter, key_to_ac);
while (g_hash_table_iter_next(&iter, &key, &value)) {
result = autocomplete_param_with_ac(input, key, value, TRUE, previous);
if (result) {
g_list_free(ac_hashes);
g_list_free(keys);
return result;
}
curr = g_list_next(curr);
}
g_list_free(keys);
curr_hash = g_list_next(curr_hash);
}
@@ -162,22 +160,19 @@ autocompleters_complete(const char* const input, gboolean previous)
curr_hash = filepath_hashes;
while (curr_hash) {
GHashTable* prefixes_hash = curr_hash->data;
GList* prefixes = g_hash_table_get_keys(prefixes_hash);
GList* curr_prefix = prefixes;
while (curr_prefix) {
char* prefix = curr_prefix->data;
GHashTableIter iter;
gpointer key, value;
g_hash_table_iter_init(&iter, prefixes_hash);
while (g_hash_table_iter_next(&iter, &key, &value)) {
char* prefix = (char*)key;
if (g_str_has_prefix(input, prefix)) {
result = cmd_ac_complete_filepath(input, prefix, previous);
if (result) {
g_list_free(filepath_hashes);
g_list_free(prefixes);
return result;
}
}
curr_prefix = g_list_next(curr_prefix);
}
g_list_free(prefixes);
curr_hash = g_list_next(curr_hash);
}