mirror of
https://git.jabber.space/devs/cproof.git
synced 2026-07-18 08:06:21 +00:00
fix: address config injection and SIGCHLD handling
- Sanitize account names to prevent GKeyFile config injection by blocking special characters like #, \n, and \r. - Ensure GLib's SIGCHLD handler is initialized before forking external editors to prevent zombie processes. - Add missing error check for OMEMO random key generation. - Replace hardcoded console tab ID with a named constant. - Log invalid JIDs safely to prevent potential null pointer issues.
This commit is contained in:
@@ -43,7 +43,8 @@ _sanitize_account_name(const char* const name)
|
|||||||
gchar* sanitized = g_strdup(name);
|
gchar* sanitized = g_strdup(name);
|
||||||
gchar* p = sanitized;
|
gchar* p = sanitized;
|
||||||
while (*p) {
|
while (*p) {
|
||||||
if (*p == '[' || *p == ']' || *p == '=') {
|
// GKeyFile special characters: [ ] = # \n \r
|
||||||
|
if (*p == '[' || *p == ']' || *p == '=' || *p == '#' || *p == '\n' || *p == '\r') {
|
||||||
*p = '_';
|
*p = '_';
|
||||||
}
|
}
|
||||||
p++;
|
p++;
|
||||||
|
|||||||
@@ -806,6 +806,10 @@ omemo_on_message_send(ProfWin* win, const char* const message, gboolean request_
|
|||||||
key_tag = gcry_malloc_secure(AES128_GCM_KEY_LENGTH + AES128_GCM_TAG_LENGTH);
|
key_tag = gcry_malloc_secure(AES128_GCM_KEY_LENGTH + AES128_GCM_TAG_LENGTH);
|
||||||
|
|
||||||
key = gcry_random_bytes_secure(AES128_GCM_KEY_LENGTH + AES128_GCM_IV_LENGTH, GCRY_VERY_STRONG_RANDOM);
|
key = gcry_random_bytes_secure(AES128_GCM_KEY_LENGTH + AES128_GCM_IV_LENGTH, GCRY_VERY_STRONG_RANDOM);
|
||||||
|
if (!key) {
|
||||||
|
log_error("[OMEMO][SEND] cannot generate random key/IV");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
iv = key + AES128_GCM_KEY_LENGTH;
|
iv = key + AES128_GCM_KEY_LENGTH;
|
||||||
|
|
||||||
res = aes128gcm_encrypt(ciphertext, &ciphertext_len, tag, &tag_len, (const unsigned char* const)message, strlen(message), iv, key);
|
res = aes128gcm_encrypt(ciphertext, &ciphertext_len, tag, &tag_len, (const unsigned char* const)message, strlen(message), iv, key);
|
||||||
|
|||||||
@@ -121,6 +121,12 @@ launch_editor(gchar* initial_content, void (*callback)(gchar* content, void* dat
|
|||||||
|
|
||||||
ui_suspend();
|
ui_suspend();
|
||||||
|
|
||||||
|
// Ensure GLib's SIGCHLD handler is installed before forking to prevent
|
||||||
|
// zombie children if the editor is launched before the main loop starts.
|
||||||
|
GMainContext* main_ctx = g_main_context_default();
|
||||||
|
g_main_context_acquire(main_ctx);
|
||||||
|
g_main_context_release(main_ctx);
|
||||||
|
|
||||||
pid_t pid = fork();
|
pid_t pid = fork();
|
||||||
if (pid == -1) {
|
if (pid == -1) {
|
||||||
log_error("[Editor] Failed to fork: %s", strerror(errno));
|
log_error("[Editor] Failed to fork: %s", strerror(errno));
|
||||||
|
|||||||
@@ -55,6 +55,8 @@ static GTimeZone* tz;
|
|||||||
static StatusBar* statusbar;
|
static StatusBar* statusbar;
|
||||||
static WINDOW* statusbar_win;
|
static WINDOW* statusbar_win;
|
||||||
|
|
||||||
|
#define CONSOLE_TAB_ID 10 // Console tab ID in status bar hash table
|
||||||
|
|
||||||
void _get_range_bounds(guint* start, guint* end, gboolean is_static);
|
void _get_range_bounds(guint* start, guint* end, gboolean is_static);
|
||||||
static guint _status_bar_draw_time(guint pos);
|
static guint _status_bar_draw_time(guint pos);
|
||||||
static guint _status_bar_draw_maintext(guint pos);
|
static guint _status_bar_draw_maintext(guint pos);
|
||||||
@@ -157,7 +159,7 @@ void
|
|||||||
status_bar_current(guint i)
|
status_bar_current(guint i)
|
||||||
{
|
{
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
statusbar->current_tab = 10;
|
statusbar->current_tab = CONSOLE_TAB_ID;
|
||||||
} else {
|
} else {
|
||||||
statusbar->current_tab = i;
|
statusbar->current_tab = i;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ Jid*
|
|||||||
jid_create(const gchar* const str)
|
jid_create(const gchar* const str)
|
||||||
{
|
{
|
||||||
if (!jid_is_valid(str)) {
|
if (!jid_is_valid(str)) {
|
||||||
|
log_debug("[JID] invalid JID: '%s'", str ?: "(null)");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user