about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/chatlog.c47
-rw-r--r--src/command/cmd_ac.c10
-rw-r--r--src/command/cmd_funcs.c3
-rw-r--r--src/common.c18
-rw-r--r--src/config/files.c4
-rw-r--r--src/config/preferences.c45
-rw-r--r--src/config/theme.c2
-rw-r--r--src/config/tlscerts.c46
-rw-r--r--src/event/server_events.c2
-rw-r--r--src/main.c3
-rw-r--r--src/omemo/omemo.c56
-rw-r--r--src/omemo/store.c33
-rw-r--r--src/plugins/python_plugins.c6
-rw-r--r--src/profanity.c6
-rw-r--r--src/tools/autocomplete.c2
-rw-r--r--src/tools/http_upload.c6
-rw-r--r--src/ui/confwin.c2
-rw-r--r--src/ui/mucwin.c16
-rw-r--r--src/xmpp/capabilities.c21
-rw-r--r--src/xmpp/jid.c7
-rw-r--r--src/xmpp/message.c17
-rw-r--r--src/xmpp/omemo.c6
-rw-r--r--src/xmpp/stanza.c27
23 files changed, 128 insertions, 257 deletions
diff --git a/src/chatlog.c b/src/chatlog.c
index c154d916..90cac638 100644
--- a/src/chatlog.c
+++ b/src/chatlog.c
@@ -96,13 +96,12 @@ chat_log_otr_msg_out(const char* const barejid, const char* const msg, const cha
 {
     if (prefs_get_boolean(PREF_CHLOG)) {
         char* mybarejid = connection_get_barejid();
-        char* pref_otr_log = prefs_get_string(PREF_OTR_LOG);
+        auto_gchar gchar* pref_otr_log = prefs_get_string(PREF_OTR_LOG);
         if (strcmp(pref_otr_log, "on") == 0) {
             _chat_log_chat(mybarejid, barejid, msg, PROF_OUT_LOG, NULL, resource);
         } else if (strcmp(pref_otr_log, "redact") == 0) {
             _chat_log_chat(mybarejid, barejid, "[redacted]", PROF_OUT_LOG, NULL, resource);
         }
-        g_free(pref_otr_log);
         free(mybarejid);
     }
 }
@@ -112,13 +111,12 @@ chat_log_pgp_msg_out(const char* const barejid, const char* const msg, const cha
 {
     if (prefs_get_boolean(PREF_CHLOG)) {
         char* mybarejid = connection_get_barejid();
-        char* pref_pgp_log = prefs_get_string(PREF_PGP_LOG);
+        auto_gchar gchar* pref_pgp_log = prefs_get_string(PREF_PGP_LOG);
         if (strcmp(pref_pgp_log, "on") == 0) {
             _chat_log_chat(mybarejid, barejid, msg, PROF_OUT_LOG, NULL, resource);
         } else if (strcmp(pref_pgp_log, "redact") == 0) {
             _chat_log_chat(mybarejid, barejid, "[redacted]", PROF_OUT_LOG, NULL, resource);
         }
-        g_free(pref_pgp_log);
         free(mybarejid);
     }
 }
@@ -128,13 +126,12 @@ chat_log_omemo_msg_out(const char* const barejid, const char* const msg, const c
 {
     if (prefs_get_boolean(PREF_CHLOG)) {
         char* mybarejid = connection_get_barejid();
-        char* pref_omemo_log = prefs_get_string(PREF_OMEMO_LOG);
+        auto_gchar gchar* pref_omemo_log = prefs_get_string(PREF_OMEMO_LOG);
         if (strcmp(pref_omemo_log, "on") == 0) {
             _chat_log_chat(mybarejid, barejid, msg, PROF_OUT_LOG, NULL, resource);
         } else if (strcmp(pref_omemo_log, "redact") == 0) {
             _chat_log_chat(mybarejid, barejid, "[redacted]", PROF_OUT_LOG, NULL, resource);
         }
-        g_free(pref_omemo_log);
         free(mybarejid);
     }
 }
@@ -144,7 +141,7 @@ chat_log_otr_msg_in(ProfMessage* message)
 {
     if (prefs_get_boolean(PREF_CHLOG)) {
         char* mybarejid = connection_get_barejid();
-        char* pref_otr_log = prefs_get_string(PREF_OTR_LOG);
+        auto_gchar gchar* pref_otr_log = prefs_get_string(PREF_OTR_LOG);
         if (message->enc == PROF_MSG_ENC_NONE || (strcmp(pref_otr_log, "on") == 0)) {
             if (message->type == PROF_MSG_TYPE_MUCPM) {
                 _chat_log_chat(mybarejid, message->from_jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, message->from_jid->resourcepart);
@@ -158,7 +155,6 @@ chat_log_otr_msg_in(ProfMessage* message)
                 _chat_log_chat(mybarejid, message->from_jid->barejid, "[redacted]", PROF_IN_LOG, message->timestamp, NULL);
             }
         }
-        g_free(pref_otr_log);
         free(mybarejid);
     }
 }
@@ -168,7 +164,7 @@ chat_log_pgp_msg_in(ProfMessage* message)
 {
     if (prefs_get_boolean(PREF_CHLOG)) {
         char* mybarejid = connection_get_barejid();
-        char* pref_pgp_log = prefs_get_string(PREF_PGP_LOG);
+        auto_gchar gchar* pref_pgp_log = prefs_get_string(PREF_PGP_LOG);
         if (strcmp(pref_pgp_log, "on") == 0) {
             if (message->type == PROF_MSG_TYPE_MUCPM) {
                 _chat_log_chat(mybarejid, message->from_jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, message->from_jid->resourcepart);
@@ -182,7 +178,6 @@ chat_log_pgp_msg_in(ProfMessage* message)
                 _chat_log_chat(mybarejid, message->from_jid->barejid, "[redacted]", PROF_IN_LOG, message->timestamp, NULL);
             }
         }
-        g_free(pref_pgp_log);
         free(mybarejid);
     }
 }
@@ -192,7 +187,7 @@ chat_log_omemo_msg_in(ProfMessage* message)
 {
     if (prefs_get_boolean(PREF_CHLOG)) {
         char* mybarejid = connection_get_barejid();
-        char* pref_omemo_log = prefs_get_string(PREF_OMEMO_LOG);
+        auto_gchar gchar* pref_omemo_log = prefs_get_string(PREF_OMEMO_LOG);
         if (strcmp(pref_omemo_log, "on") == 0) {
             if (message->type == PROF_MSG_TYPE_MUCPM) {
                 _chat_log_chat(mybarejid, message->from_jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, message->from_jid->resourcepart);
@@ -206,7 +201,6 @@ chat_log_omemo_msg_in(ProfMessage* message)
                 _chat_log_chat(mybarejid, message->from_jid->barejid, "[redacted]", PROF_IN_LOG, message->timestamp, message->from_jid->resourcepart);
             }
         }
-        g_free(pref_omemo_log);
         free(mybarejid);
     }
 }
@@ -272,7 +266,7 @@ _chat_log_chat(const char* const login, const char* const other, const char* con
         g_date_time_ref(timestamp);
     }
 
-    gchar* date_fmt = g_date_time_format_iso8601(timestamp);
+    auto_gchar gchar* date_fmt = g_date_time_format_iso8601(timestamp);
     FILE* chatlogp = fopen(dated_log->filename, "a");
     g_chmod(dated_log->filename, S_IRUSR | S_IWUSR);
     if (chatlogp) {
@@ -304,7 +298,6 @@ _chat_log_chat(const char* const login, const char* const other, const char* con
         }
     }
 
-    g_free(date_fmt);
     g_date_time_unref(timestamp);
 }
 
@@ -342,7 +335,7 @@ groupchat_log_omemo_msg_out(const gchar* const room, const gchar* const msg)
 {
     if (prefs_get_boolean(PREF_CHLOG)) {
         char* mybarejid = connection_get_barejid();
-        char* pref_omemo_log = prefs_get_string(PREF_OMEMO_LOG);
+        auto_gchar gchar* pref_omemo_log = prefs_get_string(PREF_OMEMO_LOG);
         char* mynick = muc_nick(room);
 
         if (strcmp(pref_omemo_log, "on") == 0) {
@@ -351,7 +344,6 @@ groupchat_log_omemo_msg_out(const gchar* const room, const gchar* const msg)
             _groupchat_log_chat(mybarejid, room, mynick, "[redacted]");
         }
 
-        g_free(pref_omemo_log);
         free(mybarejid);
     }
 }
@@ -360,17 +352,14 @@ void
 groupchat_log_omemo_msg_in(const gchar* const room, const gchar* const nick, const gchar* const msg)
 {
     if (prefs_get_boolean(PREF_CHLOG)) {
-        char* mybarejid = connection_get_barejid();
-        char* pref_omemo_log = prefs_get_string(PREF_OMEMO_LOG);
+        auto_char char* mybarejid = connection_get_barejid();
+        auto_gchar gchar* pref_omemo_log = prefs_get_string(PREF_OMEMO_LOG);
 
         if (strcmp(pref_omemo_log, "on") == 0) {
             _groupchat_log_chat(mybarejid, room, nick, msg);
         } else if (strcmp(pref_omemo_log, "redact") == 0) {
             _groupchat_log_chat(mybarejid, room, nick, "[redacted]");
         }
-
-        g_free(pref_omemo_log);
-        free(mybarejid);
     }
 }
 
@@ -393,7 +382,7 @@ _groupchat_log_chat(const gchar* const login, const gchar* const room, const gch
 
     GDateTime* dt_tmp = g_date_time_new_now_local();
 
-    gchar* date_fmt = g_date_time_format_iso8601(dt_tmp);
+    auto_gchar gchar* date_fmt = g_date_time_format_iso8601(dt_tmp);
 
     FILE* grpchatlogp = fopen(dated_log->filename, "a");
     g_chmod(dated_log->filename, S_IRUSR | S_IWUSR);
@@ -411,7 +400,6 @@ _groupchat_log_chat(const gchar* const login, const gchar* const room, const gch
         }
     }
 
-    g_free(date_fmt);
     g_date_time_unref(dt_tmp);
 }
 
@@ -425,21 +413,16 @@ chat_log_close(void)
 static char*
 _get_log_filename(const char* const other, const char* const login, GDateTime* dt, gboolean is_room)
 {
-    gchar* chatlogs_dir = files_file_in_account_data_path(DIR_CHATLOGS, login, is_room ? "rooms" : NULL);
-    gchar* logfile_name = g_date_time_format(dt, "%Y_%m_%d.log");
-    gchar* other_ = str_replace(other, "@", "_at_");
-    gchar* logs_path = g_strdup_printf("%s/%s", chatlogs_dir, other_);
+    auto_gchar gchar* chatlogs_dir = files_file_in_account_data_path(DIR_CHATLOGS, login, is_room ? "rooms" : NULL);
+    auto_gchar gchar* logfile_name = g_date_time_format(dt, "%Y_%m_%d.log");
+    auto_gchar gchar* other_ = str_replace(other, "@", "_at_");
+    auto_gchar gchar* logs_path = g_strdup_printf("%s/%s", chatlogs_dir, other_);
     gchar* logfile_path = NULL;
 
     if (create_dir(logs_path)) {
         logfile_path = g_strdup_printf("%s/%s", logs_path, logfile_name);
     }
 
-    g_free(logs_path);
-    g_free(other_);
-    g_free(logfile_name);
-    g_free(chatlogs_dir);
-
     return logfile_path;
 }
 
diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c
index deda8abe..765ef448 100644
--- a/src/command/cmd_ac.c
+++ b/src/command/cmd_ac.c
@@ -125,7 +125,7 @@ static char* _logging_autocomplete(ProfWin* window, const char* const input, gbo
 static char* _color_autocomplete(ProfWin* window, const char* const input, gboolean previous);
 static char* _avatar_autocomplete(ProfWin* window, const char* const input, gboolean previous);
 static char* _correction_autocomplete(ProfWin* window, const char* const input, gboolean previous);
-static char* _correct_autocomplete(ProfWin* window, const char* const input, gboolean previous);
+static gchar* _correct_autocomplete(ProfWin* window, const char* const input, gboolean previous);
 static char* _software_autocomplete(ProfWin* window, const char* const input, gboolean previous);
 static char* _url_autocomplete(ProfWin* window, const char* const input, gboolean previous);
 static char* _executable_autocomplete(ProfWin* window, const char* const input, gboolean previous);
@@ -4291,17 +4291,15 @@ _avatar_autocomplete(ProfWin* window, const char* const input, gboolean previous
 static char*
 _correction_autocomplete(ProfWin* window, const char* const input, gboolean previous)
 {
-    char* result = NULL;
-
-    result = autocomplete_param_with_ac(input, "/correction", correction_ac, TRUE, previous);
+    char* result = autocomplete_param_with_ac(input, "/correction", correction_ac, TRUE, previous);
 
     return result;
 }
 
-static char*
+static gchar*
 _correct_autocomplete(ProfWin* window, const char* const input, gboolean previous)
 {
-    char* result = g_strdup_printf("/correct %s", win_get_last_sent_message(window));
+    gchar* result = g_strdup_printf("/correct %s", win_get_last_sent_message(window));
 
     return result;
 }
diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c
index 6e9ca259..83c594f5 100644
--- a/src/command/cmd_funcs.c
+++ b/src/command/cmd_funcs.c
@@ -9703,9 +9703,8 @@ cmd_executable_vcard_photo(ProfWin* window, const char* const command, gchar** a
         cons_show("`vcard photo open` command set to invoke '%s'", args[2]);
     } else if (g_strcmp0(args[1], "default") == 0) {
         prefs_set_string(PREF_VCARD_PHOTO_CMD, NULL);
-        char* cmd = prefs_get_string(PREF_VCARD_PHOTO_CMD);
+        auto_gchar gchar* cmd = prefs_get_string(PREF_VCARD_PHOTO_CMD);
         cons_show("`vcard photo open` command set to invoke '%s' (default)", cmd);
-        g_free(cmd);
     } else {
         cons_bad_cmd_usage(command);
     }
diff --git a/src/common.c b/src/common.c
index 29fd62cb..a95233ea 100644
--- a/src/common.c
+++ b/src/common.c
@@ -457,14 +457,11 @@ GSList*
 get_mentions(gboolean whole_word, gboolean case_sensitive, const char* const message, const char* const nick)
 {
     GSList* mentions = NULL;
-    gchar* message_search = case_sensitive ? g_strdup(message) : g_utf8_strdown(message, -1);
-    gchar* mynick_search = case_sensitive ? g_strdup(nick) : g_utf8_strdown(nick, -1);
+    auto_gchar gchar* message_search = case_sensitive ? g_strdup(message) : g_utf8_strdown(message, -1);
+    auto_gchar gchar* mynick_search = case_sensitive ? g_strdup(nick) : g_utf8_strdown(nick, -1);
 
     mentions = prof_occurrences(mynick_search, message_search, 0, whole_word, &mentions);
 
-    g_free(message_search);
-    g_free(mynick_search);
-
     return mentions;
 }
 
@@ -483,11 +480,10 @@ call_external(gchar** argv)
                                   NULL, NULL, NULL,
                                   &spawn_error);
     if (!is_successful) {
-        gchar* cmd = g_strjoinv(" ", argv);
+        auto_gchar gchar* cmd = g_strjoinv(" ", argv);
         log_error("Spawning '%s' failed with error '%s'", cmd, spawn_error ? spawn_error->message : "Unknown, spawn_error is NULL");
 
         g_error_free(spawn_error);
-        g_free(cmd);
     }
 
     return is_successful;
@@ -579,7 +575,7 @@ get_expanded_path(const char* path)
 gchar*
 unique_filename_from_url(const char* url, const char* path)
 {
-    gchar* realpath;
+    auto_gchar gchar* realpath = NULL;
 
     // Default to './' as path when none has been provided.
     if (path == NULL) {
@@ -590,7 +586,7 @@ unique_filename_from_url(const char* url, const char* path)
 
     // Resolves paths such as './../.' for path.
     GFile* target = g_file_new_for_commandline_arg(realpath);
-    gchar* filename = NULL;
+    auto_gchar gchar* filename = NULL;
 
     if (_has_directory_suffix(realpath) || g_file_test(realpath, G_FILE_TEST_IS_DIR)) {
         // The target should be used as a directory. Assume that the basename
@@ -605,14 +601,10 @@ unique_filename_from_url(const char* url, const char* path)
 
     gchar* unique_filename = _unique_filename(filename);
     if (unique_filename == NULL) {
-        g_free(filename);
-        g_free(realpath);
         return NULL;
     }
 
     g_object_unref(target);
-    g_free(filename);
-    g_free(realpath);
 
     return unique_filename;
 }
diff --git a/src/config/files.c b/src/config/files.c
index e88ae687..75940c90 100644
--- a/src/config/files.c
+++ b/src/config/files.c
@@ -114,7 +114,7 @@ files_get_inputrc_file(void)
     return NULL;
 }
 
-char*
+gchar*
 files_get_log_file(const char* const log_file)
 {
     gchar* xdg_data = _files_get_xdg_data_home();
@@ -139,7 +139,7 @@ files_get_log_file(const char* const log_file)
         g_string_append(logfile, ".log");
     }
 
-    char* result = g_strdup(logfile->str);
+    gchar* result = g_strdup(logfile->str);
 
     free(xdg_data);
     g_string_free(logfile, TRUE);
diff --git a/src/config/preferences.c b/src/config/preferences.c
index 2d975e39..23709747 100644
--- a/src/config/preferences.c
+++ b/src/config/preferences.c
@@ -101,21 +101,15 @@ _prefs_load(void)
 
     // move pre 0.5.0 autoaway.message to autoaway.awaymessage
     if (g_key_file_has_key(prefs, PREF_GROUP_PRESENCE, "autoaway.message", NULL)) {
-        char* message = g_key_file_get_string(prefs, PREF_GROUP_PRESENCE, "autoaway.message", NULL);
+        auto_gchar gchar* message = g_key_file_get_string(prefs, PREF_GROUP_PRESENCE, "autoaway.message", NULL);
         g_key_file_set_string(prefs, PREF_GROUP_PRESENCE, "autoaway.awaymessage", message);
         g_key_file_remove_key(prefs, PREF_GROUP_PRESENCE, "autoaway.message", NULL);
-        g_free(message);
     }
 
     // migrate pre 0.5.0 time settings
     if (g_key_file_has_key(prefs, PREF_GROUP_UI, "time", NULL)) {
-        char* time = g_key_file_get_string(prefs, PREF_GROUP_UI, "time", NULL);
-        char* val = NULL;
-        if (time) {
-            val = time;
-        } else {
-            val = "off";
-        }
+        auto_gchar gchar* time = g_key_file_get_string(prefs, PREF_GROUP_UI, "time", NULL);
+        char* val = time ? time : "off";
         g_key_file_set_string(prefs, PREF_GROUP_UI, "time.console", val);
         g_key_file_set_string(prefs, PREF_GROUP_UI, "time.chat", val);
         g_key_file_set_string(prefs, PREF_GROUP_UI, "time.muc", val);
@@ -123,12 +117,11 @@ _prefs_load(void)
         g_key_file_set_string(prefs, PREF_GROUP_UI, "time.private", val);
         g_key_file_set_string(prefs, PREF_GROUP_UI, "time.xmlconsole", val);
         g_key_file_remove_key(prefs, PREF_GROUP_UI, "time", NULL);
-        g_free(time);
     }
 
     // move pre 0.5.0 notify settings
     if (g_key_file_has_key(prefs, PREF_GROUP_NOTIFICATIONS, "room", NULL)) {
-        char* value = g_key_file_get_string(prefs, PREF_GROUP_NOTIFICATIONS, "room", NULL);
+        auto_gchar gchar* value = g_key_file_get_string(prefs, PREF_GROUP_NOTIFICATIONS, "room", NULL);
         if (g_strcmp0(value, "on") == 0) {
             g_key_file_set_boolean(prefs, PREF_GROUP_NOTIFICATIONS, "room", TRUE);
         } else if (g_strcmp0(value, "off") == 0) {
@@ -137,7 +130,6 @@ _prefs_load(void)
             g_key_file_set_boolean(prefs, PREF_GROUP_NOTIFICATIONS, "room", FALSE);
             g_key_file_set_boolean(prefs, PREF_GROUP_NOTIFICATIONS, "room.mention", TRUE);
         }
-        g_free(value);
     }
 
     // move pre 0.6.0 titlebar settings to wintitle
@@ -154,7 +146,7 @@ _prefs_load(void)
 
     // after 0.8.1: titlebar use jid|name -> titlebar show|hide jid|name
     if (g_key_file_has_key(prefs, PREF_GROUP_UI, "titlebar.muc.title", NULL)) {
-        char* value = g_key_file_get_string(prefs, PREF_GROUP_UI, "titlebar.muc.title", NULL);
+        auto_gchar gchar* value = g_key_file_get_string(prefs, PREF_GROUP_UI, "titlebar.muc.title", NULL);
         if (g_strcmp0(value, "name") == 0) {
             g_key_file_set_boolean(prefs, PREF_GROUP_UI, "titlebar.muc.title.name", TRUE);
         } else if (g_strcmp0(value, "jid") == 0) {
@@ -164,7 +156,7 @@ _prefs_load(void)
 
     // 0.9.0 introduced /urlopen. It was saved under "logging" section. Now we have a new "executables" section.
     if (g_key_file_has_key(prefs, PREF_GROUP_LOGGING, "urlopen.cmd", NULL)) {
-        char* val = g_key_file_get_string(prefs, PREF_GROUP_LOGGING, "urlopen.cmd", NULL);
+        auto_gchar gchar* val = g_key_file_get_string(prefs, PREF_GROUP_LOGGING, "urlopen.cmd", NULL);
 
         GString* value = g_string_new("false;");
         value = g_string_append(value, val);
@@ -178,7 +170,7 @@ _prefs_load(void)
 
     // 0.9.0 introduced configurable /avatar. It was saved under "logging" section. Now we have a new "executables" section.
     if (g_key_file_has_key(prefs, PREF_GROUP_LOGGING, "avatar.cmd", NULL)) {
-        char* value = g_key_file_get_string(prefs, PREF_GROUP_LOGGING, "avatar.cmd", NULL);
+        auto_gchar gchar* value = g_key_file_get_string(prefs, PREF_GROUP_LOGGING, "avatar.cmd", NULL);
         g_key_file_set_string(prefs, PREF_GROUP_EXECUTABLES, "avatar.cmd", value);
         g_key_file_remove_key(prefs, PREF_GROUP_LOGGING, "avatar.cmd", NULL);
     }
@@ -192,7 +184,7 @@ _prefs_load(void)
     // file type or scheme matching. Move value saved under 'DEF' locale to a
     // simple key-value string not under any locale.
     {
-        char** values = g_key_file_get_locale_string_list(prefs, PREF_GROUP_EXECUTABLES, "url.open.cmd", "DEF", NULL, NULL);
+        auto_gcharv gchar** values = g_key_file_get_locale_string_list(prefs, PREF_GROUP_EXECUTABLES, "url.open.cmd", "DEF", NULL, NULL);
         if (values && !g_key_file_has_key(prefs, PREF_GROUP_EXECUTABLES, "url.open.cmd", NULL)) {
             // First value in array is `require_save` option -- we ignore that
             // one as there is no such option anymore.
@@ -201,16 +193,13 @@ _prefs_load(void)
             g_key_file_set_string(prefs, PREF_GROUP_EXECUTABLES, "url.open.cmd", executable);
             g_key_file_set_comment(prefs, PREF_GROUP_EXECUTABLES, "url.open.cmd", " Migrated from url.open.cmd[DEF]. `require_save` option has been removed in v0.10 and was discarded.", NULL);
             g_key_file_remove_key(prefs, PREF_GROUP_EXECUTABLES, "url.open.cmd[DEF]", NULL);
-
-            g_strfreev(values);
         }
 
-        char* value = g_key_file_get_locale_string(prefs, PREF_GROUP_EXECUTABLES, "url.save.cmd", "DEF", NULL);
+        auto_gchar gchar* value = g_key_file_get_locale_string(prefs, PREF_GROUP_EXECUTABLES, "url.save.cmd", "DEF", NULL);
         if (value && !g_key_file_has_key(prefs, PREF_GROUP_EXECUTABLES, "url.save.cmd", NULL)) {
             g_key_file_set_string(prefs, PREF_GROUP_EXECUTABLES, "url.save.cmd", value);
             g_key_file_set_comment(prefs, PREF_GROUP_EXECUTABLES, "url.save.cmd", " Migrated from url.save.cmd[DEF].", NULL);
             g_key_file_remove_key(prefs, PREF_GROUP_EXECUTABLES, "url.save.cmd[DEF]", NULL);
-            g_free(value);
         }
     }
 
@@ -342,20 +331,18 @@ prefs_message_get_triggers(const char* const message)
 {
     GList* result = NULL;
 
-    char* message_lower = g_utf8_strdown(message, -1);
+    auto_gchar gchar* message_lower = g_utf8_strdown(message, -1);
     gsize len = 0;
     gchar** triggers = g_key_file_get_string_list(prefs, PREF_GROUP_NOTIFICATIONS, "room.trigger.list", &len, NULL);
 
     for (int i = 0; i < len; i++) {
-        char* trigger_lower = g_utf8_strdown(triggers[i], -1);
+        auto_gchar gchar* trigger_lower = g_utf8_strdown(triggers[i], -1);
         if (g_strrstr(message_lower, trigger_lower)) {
             result = g_list_append(result, strdup(triggers[i]));
         }
-        g_free(trigger_lower);
     }
 
     g_strfreev(triggers);
-    g_free(message_lower);
 
     return result;
 }
@@ -540,7 +527,7 @@ prefs_get_string(preference_t pref)
     const char* key = _get_key(pref);
     char* def = _get_default_string(pref);
 
-    char* result = g_key_file_get_string(prefs, group, key, NULL);
+    gchar* result = g_key_file_get_string(prefs, group, key, NULL);
 
     if (result == NULL) {
         if (def) {
@@ -632,10 +619,9 @@ prefs_get_tls_certpath(void)
     const char* group = _get_group(PREF_TLS_CERTPATH);
     const char* key = _get_key(PREF_TLS_CERTPATH);
 
-    char* setting = g_key_file_get_string(prefs, group, key, NULL);
+    auto_gchar gchar* setting = g_key_file_get_string(prefs, group, key, NULL);
 
     if (g_strcmp0(setting, "none") == 0) {
-        g_free(setting);
         return NULL;
     }
 
@@ -660,7 +646,6 @@ prefs_get_tls_certpath(void)
     }
 
     char* result = strdup(setting);
-    g_free(setting);
 
     return result;
 }
@@ -1684,15 +1669,13 @@ prefs_get_aliases(void)
 
         for (int i = 0; i < len; i++) {
             char* name = keys[i];
-            char* value = g_key_file_get_string(prefs, PREF_GROUP_ALIAS, name, NULL);
+            auto_gchar gchar* value = g_key_file_get_string(prefs, PREF_GROUP_ALIAS, name, NULL);
 
             if (value) {
                 ProfAlias* alias = malloc(sizeof(struct prof_alias_t));
                 alias->name = strdup(name);
                 alias->value = strdup(value);
 
-                free(value);
-
                 result = g_list_insert_sorted(result, alias, (GCompareFunc)_alias_cmp);
             }
         }
diff --git a/src/config/theme.c b/src/config/theme.c
index a39362fb..4909f6b7 100644
--- a/src/config/theme.c
+++ b/src/config/theme.c
@@ -686,7 +686,7 @@ _theme_prep_fgnd(char* setting, GString* lookup_str, gboolean* bold)
 char*
 theme_get_string(char* str)
 {
-    char* res = g_key_file_get_string(theme, "colours", str, NULL);
+    gchar* res = g_key_file_get_string(theme, "colours", str, NULL);
     if (!res) {
         return strdup(g_hash_table_lookup(defaults, str));
     } else {
diff --git a/src/config/tlscerts.c b/src/config/tlscerts.c
index 008d28f6..d2f053fa 100644
--- a/src/config/tlscerts.c
+++ b/src/config/tlscerts.c
@@ -121,26 +121,17 @@ tlscerts_list(void)
     for (int i = 0; i < g_strv_length(groups); i++) {
         char* fingerprint = strdup(groups[i]);
         int version = g_key_file_get_integer(tlscerts, fingerprint, "version", NULL);
-        char* serialnumber = g_key_file_get_string(tlscerts, fingerprint, "serialnumber", NULL);
-        char* subjectname = g_key_file_get_string(tlscerts, fingerprint, "subjectname", NULL);
-        char* issuername = g_key_file_get_string(tlscerts, fingerprint, "issuername", NULL);
-        char* notbefore = g_key_file_get_string(tlscerts, fingerprint, "start", NULL);
-        char* notafter = g_key_file_get_string(tlscerts, fingerprint, "end", NULL);
-        char* keyalg = g_key_file_get_string(tlscerts, fingerprint, "keyalg", NULL);
-        char* signaturealg = g_key_file_get_string(tlscerts, fingerprint, "signaturealg", NULL);
+        auto_gchar gchar* serialnumber = g_key_file_get_string(tlscerts, fingerprint, "serialnumber", NULL);
+        auto_gchar gchar* subjectname = g_key_file_get_string(tlscerts, fingerprint, "subjectname", NULL);
+        auto_gchar gchar* issuername = g_key_file_get_string(tlscerts, fingerprint, "issuername", NULL);
+        auto_gchar gchar* notbefore = g_key_file_get_string(tlscerts, fingerprint, "start", NULL);
+        auto_gchar gchar* notafter = g_key_file_get_string(tlscerts, fingerprint, "end", NULL);
+        auto_gchar gchar* keyalg = g_key_file_get_string(tlscerts, fingerprint, "keyalg", NULL);
+        auto_gchar gchar* signaturealg = g_key_file_get_string(tlscerts, fingerprint, "signaturealg", NULL);
 
         TLSCertificate* cert = tlscerts_new(fingerprint, version, serialnumber, subjectname, issuername, notbefore,
                                             notafter, keyalg, signaturealg, NULL);
 
-        free(fingerprint);
-        free(serialnumber);
-        free(subjectname);
-        free(issuername);
-        free(notbefore);
-        free(notafter);
-        free(keyalg);
-        free(signaturealg);
-
         res = g_list_append(res, cert);
     }
 
@@ -316,25 +307,16 @@ tlscerts_get_trusted(const char* const fingerprint)
     }
 
     int version = g_key_file_get_integer(tlscerts, fingerprint, "version", NULL);
-    char* serialnumber = g_key_file_get_string(tlscerts, fingerprint, "serialnumber", NULL);
-    char* subjectname = g_key_file_get_string(tlscerts, fingerprint, "subjectname", NULL);
-    char* issuername = g_key_file_get_string(tlscerts, fingerprint, "issuername", NULL);
-    char* notbefore = g_key_file_get_string(tlscerts, fingerprint, "start", NULL);
-    char* notafter = g_key_file_get_string(tlscerts, fingerprint, "end", NULL);
-    char* keyalg = g_key_file_get_string(tlscerts, fingerprint, "keyalg", NULL);
-    char* signaturealg = g_key_file_get_string(tlscerts, fingerprint, "signaturealg", NULL);
+    auto_gchar gchar* serialnumber = g_key_file_get_string(tlscerts, fingerprint, "serialnumber", NULL);
+    auto_gchar gchar* subjectname = g_key_file_get_string(tlscerts, fingerprint, "subjectname", NULL);
+    auto_gchar gchar* issuername = g_key_file_get_string(tlscerts, fingerprint, "issuername", NULL);
+    auto_gchar gchar* notbefore = g_key_file_get_string(tlscerts, fingerprint, "start", NULL);
+    auto_gchar gchar* notafter = g_key_file_get_string(tlscerts, fingerprint, "end", NULL);
+    auto_gchar gchar* keyalg = g_key_file_get_string(tlscerts, fingerprint, "keyalg", NULL);
+    auto_gchar gchar* signaturealg = g_key_file_get_string(tlscerts, fingerprint, "signaturealg", NULL);
 
     TLSCertificate* cert = tlscerts_new(fingerprint, version, serialnumber, subjectname, issuername, notbefore,
                                         notafter, keyalg, signaturealg, NULL);
-
-    free(serialnumber);
-    free(subjectname);
-    free(issuername);
-    free(notbefore);
-    free(notafter);
-    free(keyalg);
-    free(signaturealg);
-
     return cert;
 }
 
diff --git a/src/event/server_events.c b/src/event/server_events.c
index 0f6df2ac..01002a1e 100644
--- a/src/event/server_events.c
+++ b/src/event/server_events.c
@@ -1346,7 +1346,7 @@ static void
 _cut(ProfMessage* message, const char* cut)
 {
     if (strstr(message->plain, cut)) {
-        char** split = g_strsplit(message->plain, cut, -1);
+        gchar** split = g_strsplit(message->plain, cut, -1);
         free(message->plain);
         message->plain = g_strjoinv("", split);
         g_strfreev(split);
diff --git a/src/main.c b/src/main.c
index 6cbca667..6edfd3c8 100644
--- a/src/main.c
+++ b/src/main.c
@@ -160,9 +160,8 @@ main(int argc, char** argv)
 #endif
 
 #ifdef HAVE_PYTHON
-        gchar* python_version = python_get_version_number();
+        auto_gchar gchar* python_version = python_get_version_number();
         g_print("Python plugins: Enabled (%s)\n", python_version);
-        g_free(python_version);
 #else
         g_print("Python plugins: Disabled\n");
 #endif
diff --git a/src/omemo/omemo.c b/src/omemo/omemo.c
index 69a9fc30..303fa689 100644
--- a/src/omemo/omemo.c
+++ b/src/omemo/omemo.c
@@ -350,14 +350,12 @@ omemo_generate_crypto_materials(ProfAccount* account)
     signal_protocol_key_helper_generate_identity_key_pair(&omemo_ctx.identity_key_pair, omemo_ctx.signal);
 
     ec_public_key_serialize(&omemo_ctx.identity_key_store.public, ratchet_identity_key_pair_get_public(omemo_ctx.identity_key_pair));
-    char* identity_key_public = g_base64_encode(signal_buffer_data(omemo_ctx.identity_key_store.public), signal_buffer_len(omemo_ctx.identity_key_store.public));
+    auto_gchar gchar* identity_key_public = g_base64_encode(signal_buffer_data(omemo_ctx.identity_key_store.public), signal_buffer_len(omemo_ctx.identity_key_store.public));
     g_key_file_set_string(omemo_ctx.identity_keyfile, OMEMO_STORE_GROUP_IDENTITY, OMEMO_STORE_KEY_IDENTITY_KEY_PUBLIC, identity_key_public);
-    g_free(identity_key_public);
 
     ec_private_key_serialize(&omemo_ctx.identity_key_store.private, ratchet_identity_key_pair_get_private(omemo_ctx.identity_key_pair));
-    char* identity_key_private = g_base64_encode(signal_buffer_data(omemo_ctx.identity_key_store.private), signal_buffer_len(omemo_ctx.identity_key_store.private));
+    auto_gchar gchar* identity_key_private = g_base64_encode(signal_buffer_data(omemo_ctx.identity_key_store.private), signal_buffer_len(omemo_ctx.identity_key_store.private));
     g_key_file_set_string(omemo_ctx.identity_keyfile, OMEMO_STORE_GROUP_IDENTITY, OMEMO_STORE_KEY_IDENTITY_KEY_PRIVATE, identity_key_private);
-    g_free(identity_key_private);
 
     /* Registration ID */
     signal_protocol_key_helper_generate_registration_id(&omemo_ctx.registration_id, 0, omemo_ctx.signal);
@@ -1322,19 +1320,19 @@ omemo_untrust(const char* const jid, const char* const fingerprint_formatted)
     }
     free(identity);
 
-    char* fingerprint = _omemo_unformat_fingerprint(fingerprint_formatted);
+    auto_char char* fingerprint = _omemo_unformat_fingerprint(fingerprint_formatted);
 
     /* Remove existing session */
     GHashTable* known_identities = g_hash_table_lookup(omemo_ctx.known_devices, jid);
     if (!known_identities) {
         log_error("[OMEMO] cannot find known device while untrusting a fingerprint");
-        goto out;
+        return;
     }
 
     uint32_t device_id = GPOINTER_TO_INT(g_hash_table_lookup(known_identities, fingerprint));
     if (!device_id) {
         log_error("[OMEMO] cannot find device id while untrusting a fingerprint");
-        goto out;
+        return;
     }
     signal_protocol_address address = {
         .name = jid,
@@ -1345,13 +1343,9 @@ omemo_untrust(const char* const jid, const char* const fingerprint_formatted)
     delete_session(&address, omemo_ctx.session_store);
 
     /* Remove from keyfile */
-    char* device_id_str = g_strdup_printf("%d", device_id);
+    auto_gchar gchar* device_id_str = g_strdup_printf("%d", device_id);
     g_key_file_remove_key(omemo_ctx.trust_keyfile, jid, device_id_str, NULL);
-    g_free(device_id_str);
     omemo_trust_keyfile_save();
-
-out:
-    free(fingerprint);
 }
 
 static void
@@ -1540,7 +1534,7 @@ _load_identity(void)
 
     /* Identity key */
     error = NULL;
-    char* identity_key_public_b64 = g_key_file_get_string(omemo_ctx.identity_keyfile, OMEMO_STORE_GROUP_IDENTITY, OMEMO_STORE_KEY_IDENTITY_KEY_PUBLIC, &error);
+    auto_gchar gchar* identity_key_public_b64 = g_key_file_get_string(omemo_ctx.identity_keyfile, OMEMO_STORE_GROUP_IDENTITY, OMEMO_STORE_KEY_IDENTITY_KEY_PUBLIC, &error);
     if (!identity_key_public_b64) {
         log_error("[OMEMO] cannot load identity public key: %s", error->message);
         return FALSE;
@@ -1548,11 +1542,10 @@ _load_identity(void)
 
     size_t identity_key_public_len;
     unsigned char* identity_key_public = g_base64_decode(identity_key_public_b64, &identity_key_public_len);
-    g_free(identity_key_public_b64);
     omemo_ctx.identity_key_store.public = signal_buffer_create(identity_key_public, identity_key_public_len);
 
     error = NULL;
-    char* identity_key_private_b64 = g_key_file_get_string(omemo_ctx.identity_keyfile, OMEMO_STORE_GROUP_IDENTITY, OMEMO_STORE_KEY_IDENTITY_KEY_PRIVATE, &error);
+    auto_gchar gchar* identity_key_private_b64 = g_key_file_get_string(omemo_ctx.identity_keyfile, OMEMO_STORE_GROUP_IDENTITY, OMEMO_STORE_KEY_IDENTITY_KEY_PRIVATE, &error);
     if (!identity_key_private_b64) {
         log_error("[OMEMO] cannot load identity private key: %s", error->message);
         return FALSE;
@@ -1560,7 +1553,6 @@ _load_identity(void)
 
     size_t identity_key_private_len;
     unsigned char* identity_key_private = g_base64_decode(identity_key_private_b64, &identity_key_private_len);
-    g_free(identity_key_private_b64);
     omemo_ctx.identity_key_store.private = signal_buffer_create(identity_key_private, identity_key_private_len);
 
     ec_public_key* public_key;
@@ -1579,10 +1571,9 @@ _load_identity(void)
     keys = g_key_file_get_keys(omemo_ctx.identity_keyfile, OMEMO_STORE_GROUP_PREKEYS, NULL, NULL);
     if (keys) {
         for (i = 0; keys[i] != NULL; i++) {
-            char* pre_key_b64 = g_key_file_get_string(omemo_ctx.identity_keyfile, OMEMO_STORE_GROUP_PREKEYS, keys[i], NULL);
+            auto_gchar gchar* pre_key_b64 = g_key_file_get_string(omemo_ctx.identity_keyfile, OMEMO_STORE_GROUP_PREKEYS, keys[i], NULL);
             size_t pre_key_len;
             unsigned char* pre_key = g_base64_decode(pre_key_b64, &pre_key_len);
-            g_free(pre_key_b64);
             signal_buffer* buffer = signal_buffer_create(pre_key, pre_key_len);
             g_free(pre_key);
             g_hash_table_insert(omemo_ctx.pre_key_store, GINT_TO_POINTER(strtoul(keys[i], NULL, 10)), buffer);
@@ -1601,10 +1592,9 @@ _load_identity(void)
     keys = g_key_file_get_keys(omemo_ctx.identity_keyfile, OMEMO_STORE_GROUP_SIGNED_PREKEYS, NULL, NULL);
     if (keys) {
         for (i = 0; keys[i] != NULL; i++) {
-            char* signed_pre_key_b64 = g_key_file_get_string(omemo_ctx.identity_keyfile, OMEMO_STORE_GROUP_SIGNED_PREKEYS, keys[i], NULL);
+            auto_gchar gchar* signed_pre_key_b64 = g_key_file_get_string(omemo_ctx.identity_keyfile, OMEMO_STORE_GROUP_SIGNED_PREKEYS, keys[i], NULL);
             size_t signed_pre_key_len;
             unsigned char* signed_pre_key = g_base64_decode(signed_pre_key_b64, &signed_pre_key_len);
-            g_free(signed_pre_key_b64);
             signal_buffer* buffer = signal_buffer_create(signed_pre_key, signed_pre_key_len);
             g_free(signed_pre_key);
             g_hash_table_insert(omemo_ctx.signed_pre_key_store, GINT_TO_POINTER(strtoul(keys[i], NULL, 10)), buffer);
@@ -1629,7 +1619,7 @@ static void
 _load_trust(void)
 {
     char** keys = NULL;
-    char** groups = g_key_file_get_groups(omemo_ctx.trust_keyfile, NULL);
+    gchar** groups = g_key_file_get_groups(omemo_ctx.trust_keyfile, NULL);
     if (groups) {
         int i;
         for (i = 0; groups[i] != NULL; i++) {
@@ -1644,10 +1634,9 @@ _load_trust(void)
             keys = g_key_file_get_keys(omemo_ctx.trust_keyfile, groups[i], NULL, NULL);
             int j;
             for (j = 0; keys[j] != NULL; j++) {
-                char* key_b64 = g_key_file_get_string(omemo_ctx.trust_keyfile, groups[i], keys[j], NULL);
+                auto_gchar gchar* key_b64 = g_key_file_get_string(omemo_ctx.trust_keyfile, groups[i], keys[j], NULL);
                 size_t key_len;
                 unsigned char* key = g_base64_decode(key_b64, &key_len);
-                g_free(key_b64);
                 signal_buffer* buffer = signal_buffer_create(key, key_len);
                 g_free(key);
                 uint32_t device_id = strtoul(keys[j], NULL, 10);
@@ -1663,7 +1652,7 @@ static void
 _load_sessions(void)
 {
     int i;
-    char** groups = g_key_file_get_groups(omemo_ctx.sessions_keyfile, NULL);
+    auto_gcharv gchar** groups = g_key_file_get_groups(omemo_ctx.sessions_keyfile, NULL);
     if (groups) {
         for (i = 0; groups[i] != NULL; i++) {
             int j;
@@ -1675,20 +1664,17 @@ _load_sessions(void)
                 g_hash_table_insert(omemo_ctx.session_store, strdup(groups[i]), device_store);
             }
 
-            char** keys = g_key_file_get_keys(omemo_ctx.sessions_keyfile, groups[i], NULL, NULL);
+            auto_gcharv gchar** keys = g_key_file_get_keys(omemo_ctx.sessions_keyfile, groups[i], NULL, NULL);
             for (j = 0; keys[j] != NULL; j++) {
                 uint32_t id = strtoul(keys[j], NULL, 10);
-                char* record_b64 = g_key_file_get_string(omemo_ctx.sessions_keyfile, groups[i], keys[j], NULL);
+                auto_gchar gchar* record_b64 = g_key_file_get_string(omemo_ctx.sessions_keyfile, groups[i], keys[j], NULL);
                 size_t record_len;
                 unsigned char* record = g_base64_decode(record_b64, &record_len);
-                g_free(record_b64);
                 signal_buffer* buffer = signal_buffer_create(record, record_len);
                 g_free(record);
                 g_hash_table_insert(device_store, GINT_TO_POINTER(id), buffer);
             }
-            g_strfreev(keys);
         }
-        g_strfreev(groups);
     }
 }
 
@@ -1696,7 +1682,7 @@ static void
 _load_known_devices(void)
 {
     int i;
-    char** groups = g_key_file_get_groups(omemo_ctx.known_devices_keyfile, NULL);
+    auto_gcharv gchar** groups = g_key_file_get_groups(omemo_ctx.known_devices_keyfile, NULL);
     if (groups) {
         for (i = 0; groups[i] != NULL; i++) {
             int j;
@@ -1708,16 +1694,13 @@ _load_known_devices(void)
                 g_hash_table_insert(omemo_ctx.known_devices, strdup(groups[i]), known_identities);
             }
 
-            char** keys = g_key_file_get_keys(omemo_ctx.known_devices_keyfile, groups[i], NULL, NULL);
+            auto_gcharv gchar** keys = g_key_file_get_keys(omemo_ctx.known_devices_keyfile, groups[i], NULL, NULL);
             for (j = 0; keys[j] != NULL; j++) {
                 uint32_t device_id = strtoul(keys[j], NULL, 10);
-                char* fingerprint = g_key_file_get_string(omemo_ctx.known_devices_keyfile, groups[i], keys[j], NULL);
+                auto_gchar gchar* fingerprint = g_key_file_get_string(omemo_ctx.known_devices_keyfile, groups[i], keys[j], NULL);
                 g_hash_table_insert(known_identities, strdup(fingerprint), GINT_TO_POINTER(device_id));
-                g_free(fingerprint);
             }
-            g_strfreev(keys);
         }
-        g_strfreev(groups);
     }
 }
 
@@ -1734,9 +1717,8 @@ _cache_device_identity(const char* const jid, uint32_t device_id, ec_public_key*
     log_debug("[OMEMO] cache identity for %s:%d: %s", jid, device_id, fingerprint);
     g_hash_table_insert(known_identities, strdup(fingerprint), GINT_TO_POINTER(device_id));
 
-    char* device_id_str = g_strdup_printf("%d", device_id);
+    auto_gchar gchar* device_id_str = g_strdup_printf("%d", device_id);
     g_key_file_set_string(omemo_ctx.known_devices_keyfile, jid, device_id_str, fingerprint);
-    g_free(device_id_str);
     omemo_known_devices_keyfile_save();
 
     Autocomplete ac = g_hash_table_lookup(omemo_ctx.fingerprint_ac, jid);
diff --git a/src/omemo/store.c b/src/omemo/store.c
index 3825c95d..08291460 100644
--- a/src/omemo/store.c
+++ b/src/omemo/store.c
@@ -143,11 +143,9 @@ store_session(const signal_protocol_address* address,
     signal_buffer* buffer = signal_buffer_create(record, record_len);
     g_hash_table_insert(device_store, GINT_TO_POINTER(address->device_id), buffer);
 
-    char* record_b64 = g_base64_encode(record, record_len);
-    char* device_id = g_strdup_printf("%d", address->device_id);
+    auto_gchar gchar* record_b64 = g_base64_encode(record, record_len);
+    auto_gchar gchar* device_id = g_strdup_printf("%d", address->device_id);
     g_key_file_set_string(omemo_sessions_keyfile(), address->name, device_id, record_b64);
-    free(device_id);
-    g_free(record_b64);
 
     omemo_sessions_keyfile_save();
 
@@ -187,9 +185,8 @@ delete_session(const signal_protocol_address* address, void* user_data)
 
     g_hash_table_remove(device_store, GINT_TO_POINTER(address->device_id));
 
-    char* device_id_str = g_strdup_printf("%d", address->device_id);
+    auto_gchar gchar* device_id_str = g_strdup_printf("%d", address->device_id);
     g_key_file_remove_key(omemo_sessions_keyfile(), address->name, device_id_str, NULL);
-    g_free(device_id_str);
     omemo_sessions_keyfile_save();
 
     return SG_SUCCESS;
@@ -238,11 +235,9 @@ store_pre_key(uint32_t pre_key_id, uint8_t* record, size_t record_len,
     g_hash_table_insert(pre_key_store, GINT_TO_POINTER(pre_key_id), buffer);
 
     /* Long term storage */
-    char* pre_key_id_str = g_strdup_printf("%d", pre_key_id);
-    char* record_b64 = g_base64_encode(record, record_len);
+    auto_gchar gchar* pre_key_id_str = g_strdup_printf("%d", pre_key_id);
+    auto_gchar gchar* record_b64 = g_base64_encode(record, record_len);
     g_key_file_set_string(omemo_identity_keyfile(), OMEMO_STORE_GROUP_PREKEYS, pre_key_id_str, record_b64);
-    g_free(pre_key_id_str);
-    g_free(record_b64);
 
     omemo_identity_keyfile_save();
 
@@ -265,9 +260,8 @@ remove_pre_key(uint32_t pre_key_id, void* user_data)
     int ret = g_hash_table_remove(pre_key_store, GINT_TO_POINTER(pre_key_id));
 
     /* Long term storage */
-    char* pre_key_id_str = g_strdup_printf("%d", pre_key_id);
+    auto_gchar gchar* pre_key_id_str = g_strdup_printf("%d", pre_key_id);
     g_key_file_remove_key(omemo_identity_keyfile(), OMEMO_STORE_GROUP_PREKEYS, pre_key_id_str, NULL);
-    g_free(pre_key_id_str);
 
     omemo_identity_keyfile_save();
 
@@ -306,11 +300,9 @@ store_signed_pre_key(uint32_t signed_pre_key_id, uint8_t* record,
     g_hash_table_insert(signed_pre_key_store, GINT_TO_POINTER(signed_pre_key_id), buffer);
 
     /* Long term storage */
-    char* signed_pre_key_id_str = g_strdup_printf("%d", signed_pre_key_id);
-    char* record_b64 = g_base64_encode(record, record_len);
+    auto_gchar gchar* signed_pre_key_id_str = g_strdup_printf("%d", signed_pre_key_id);
+    auto_gchar gchar* record_b64 = g_base64_encode(record, record_len);
     g_key_file_set_string(omemo_identity_keyfile(), OMEMO_STORE_GROUP_SIGNED_PREKEYS, signed_pre_key_id_str, record_b64);
-    g_free(signed_pre_key_id_str);
-    g_free(record_b64);
 
     omemo_identity_keyfile_save();
 
@@ -333,9 +325,8 @@ remove_signed_pre_key(uint32_t signed_pre_key_id, void* user_data)
     int ret = g_hash_table_remove(signed_pre_key_store, GINT_TO_POINTER(signed_pre_key_id));
 
     /* Long term storage */
-    char* signed_pre_key_id_str = g_strdup_printf("%d", signed_pre_key_id);
+    auto_gchar gchar* signed_pre_key_id_str = g_strdup_printf("%d", signed_pre_key_id);
     g_key_file_remove_key(omemo_identity_keyfile(), OMEMO_STORE_GROUP_PREKEYS, signed_pre_key_id_str, NULL);
-    g_free(signed_pre_key_id_str);
 
     omemo_identity_keyfile_save();
 
@@ -393,11 +384,9 @@ save_identity(const signal_protocol_address* address, uint8_t* key_data,
     g_hash_table_insert(trusted, GINT_TO_POINTER(address->device_id), buffer);
 
     /* Long term storage */
-    char* key_b64 = g_base64_encode(key_data, key_len);
-    char* device_id = g_strdup_printf("%d", address->device_id);
+    auto_gchar gchar* key_b64 = g_base64_encode(key_data, key_len);
+    auto_gchar gchar* device_id = g_strdup_printf("%d", address->device_id);
     g_key_file_set_string(omemo_trust_keyfile(), address->name, device_id, key_b64);
-    g_free(device_id);
-    g_free(key_b64);
 
     omemo_trust_keyfile_save();
 
diff --git a/src/plugins/python_plugins.c b/src/plugins/python_plugins.c
index c32d177c..cf1e4a87 100644
--- a/src/plugins/python_plugins.c
+++ b/src/plugins/python_plugins.c
@@ -874,9 +874,8 @@ static void
 _python_undefined_error(ProfPlugin* plugin, char* hook, char* type)
 {
     GString* err_msg = g_string_new("Plugin error - ");
-    char* module_name = g_strndup(plugin->name, strlen(plugin->name) - 2);
+    auto_gchar gchar* module_name = g_strndup(plugin->name, strlen(plugin->name) - 2);
     g_string_append(err_msg, module_name);
-    free(module_name);
     g_string_append(err_msg, hook);
     g_string_append(err_msg, "(): return value undefined, expected ");
     g_string_append(err_msg, type);
@@ -889,9 +888,8 @@ static void
 _python_type_error(ProfPlugin* plugin, char* hook, char* type)
 {
     GString* err_msg = g_string_new("Plugin error - ");
-    char* module_name = g_strndup(plugin->name, strlen(plugin->name) - 2);
+    auto_gchar gchar* module_name = g_strndup(plugin->name, strlen(plugin->name) - 2);
     g_string_append(err_msg, module_name);
-    free(module_name);
     g_string_append(err_msg, hook);
     g_string_append(err_msg, "(): incorrect return type, expected ");
     g_string_append(err_msg, type);
diff --git a/src/profanity.c b/src/profanity.c
index 2c6ad12d..42983993 100644
--- a/src/profanity.c
+++ b/src/profanity.c
@@ -151,10 +151,9 @@ _connect_default(const char* const account)
     if (account) {
         cmd_execute_connect(window, account);
     } else {
-        char* pref_connect_account = prefs_get_string(PREF_CONNECT_ACCOUNT);
+        auto_gchar gchar* pref_connect_account = prefs_get_string(PREF_CONNECT_ACCOUNT);
         if (pref_connect_account) {
             cmd_execute_connect(window, pref_connect_account);
-            g_free(pref_connect_account);
         }
     }
 }
@@ -198,9 +197,8 @@ _init(char* log_level, char* config_file, char* log_file, char* theme_name)
     if (theme_name) {
         theme_init(theme_name);
     } else {
-        char* theme = prefs_get_string(PREF_THEME);
+        auto_gchar gchar* theme = prefs_get_string(PREF_THEME);
         theme_init(theme);
-        g_free(theme);
     }
 
     ui_init();
diff --git a/src/tools/autocomplete.c b/src/tools/autocomplete.c
index 27532081..8c7818e7 100644
--- a/src/tools/autocomplete.c
+++ b/src/tools/autocomplete.c
@@ -315,7 +315,7 @@ static char*
 _autocomplete_param_common(const char* const input, char* command, autocomplete_func func, Autocomplete ac, gboolean quote, gboolean previous, void* context)
 {
     int len;
-    auto_char char* command_cpy = g_strdup_printf("%s ", command);
+    auto_gchar gchar* command_cpy = g_strdup_printf("%s ", command);
     if (!command_cpy) {
         return NULL;
     }
diff --git a/src/tools/http_upload.c b/src/tools/http_upload.c
index 4dae41c5..289dba15 100644
--- a/src/tools/http_upload.c
+++ b/src/tools/http_upload.c
@@ -399,15 +399,13 @@ file_mime_type(const char* const filename)
     size_t file_header_size = fread(file_header, 1, FILE_HEADER_BYTES, fh);
     fclose(fh);
 
-    char* content_type = g_content_type_guess(filename, (unsigned char*)file_header, file_header_size, NULL);
+    auto_gchar gchar* content_type = g_content_type_guess(filename, (unsigned char*)file_header, file_header_size, NULL);
     if (content_type != NULL) {
-        char* mime_type = g_content_type_get_mime_type(content_type);
+        auto_gchar gchar* mime_type = g_content_type_get_mime_type(content_type);
         out_mime_type = strdup(mime_type);
-        g_free(mime_type);
     } else {
         return strdup(FALLBACK_MIMETYPE);
     }
-    g_free(content_type);
     return out_mime_type;
 }
 
diff --git a/src/ui/confwin.c b/src/ui/confwin.c
index 85abe748..a49b7010 100644
--- a/src/ui/confwin.c
+++ b/src/ui/confwin.c
@@ -70,7 +70,7 @@ confwin_show_form(ProfConfWin* confwin)
                 win_println(window, THEME_DEFAULT, "-", "%s", value);
             }
         } else if (g_strcmp0(field->type, "hidden") != 0 && field->var) {
-            char* tag = g_hash_table_lookup(confwin->form->var_to_tag, field->var);
+            gchar* tag = g_hash_table_lookup(confwin->form->var_to_tag, field->var);
             _confwin_form_field(window, tag, field);
         }
 
diff --git a/src/ui/mucwin.c b/src/ui/mucwin.c
index 550b05e2..a2c31421 100644
--- a/src/ui/mucwin.c
+++ b/src/ui/mucwin.c
@@ -391,7 +391,7 @@ _mucwin_print_mention(ProfWin* window, const char* const message, const char* co
     while (curr) {
         pos = GPOINTER_TO_INT(curr->data);
 
-        char* before_str = g_utf8_substring(message, last_pos, pos);
+        auto_gchar gchar* before_str = g_utf8_substring(message, last_pos, pos);
 
         if (last_pos == 0 && strncmp(before_str, "/me ", 4) == 0) {
             win_print_them(window, THEME_ROOMMENTION, ch, flags, "");
@@ -404,11 +404,9 @@ _mucwin_print_mention(ProfWin* window, const char* const message, const char* co
             }
             win_append_highlight(window, THEME_ROOMMENTION, "%s", before_str);
         }
-        g_free(before_str);
 
-        char* mynick_str = g_utf8_substring(message, pos, pos + mynick_len);
+        auto_gchar gchar* mynick_str = g_utf8_substring(message, pos, pos + mynick_len);
         win_append_highlight(window, THEME_ROOMMENTION_TERM, "%s", mynick_str);
-        g_free(mynick_str);
 
         last_pos = pos + mynick_len;
 
@@ -418,7 +416,7 @@ _mucwin_print_mention(ProfWin* window, const char* const message, const char* co
     glong message_len = g_utf8_strlen(message, -1);
     if (last_pos < message_len) {
         // get tail without allocating a new string
-        char* rest = g_utf8_offset_to_pointer(message, last_pos);
+        gchar* rest = g_utf8_offset_to_pointer(message, last_pos);
         win_appendln_highlight(window, THEME_ROOMMENTION, "%s", rest);
     } else {
         win_appendln_highlight(window, THEME_ROOMMENTION, "");
@@ -449,15 +447,15 @@ _mucwin_print_triggers(ProfWin* window, const char* const message, GList* trigge
         curr = g_list_next(curr);
     }
 
-    char* message_lower = g_utf8_strdown(message, -1);
+    auto_gchar gchar* message_lower = g_utf8_strdown(message, -1);
 
     // find earliest trigger in message
     int first_trigger_pos = -1;
     int first_trigger_len = -1;
     curr = weighted_triggers;
     while (curr) {
-        char* trigger_lower = g_utf8_strdown(curr->data, -1);
-        char* trigger_ptr = g_strstr_len(message_lower, -1, trigger_lower);
+        auto_gchar gchar* trigger_lower = g_utf8_strdown(curr->data, -1);
+        gchar* trigger_ptr = g_strstr_len(message_lower, -1, trigger_lower);
 
         // not found, try next
         if (trigger_ptr == NULL) {
@@ -472,11 +470,9 @@ _mucwin_print_triggers(ProfWin* window, const char* const message, GList* trigge
             first_trigger_len = strlen(trigger_lower);
         }
 
-        g_free(trigger_lower);
         curr = g_list_next(curr);
     }
 
-    g_free(message_lower);
     g_list_free(weighted_triggers);
 
     // no triggers found
diff --git a/src/xmpp/capabilities.c b/src/xmpp/capabilities.c
index 638b2c90..3bd567cd 100644
--- a/src/xmpp/capabilities.c
+++ b/src/xmpp/capabilities.c
@@ -368,14 +368,14 @@ _caps_by_ver(const char* const ver)
         return NULL;
     }
 
-    char* category = g_key_file_get_string(cache, ver, "category", NULL);
-    char* type = g_key_file_get_string(cache, ver, "type", NULL);
-    char* name = g_key_file_get_string(cache, ver, "name", NULL);
+    auto_gchar gchar* category = g_key_file_get_string(cache, ver, "category", NULL);
+    auto_gchar gchar* type = g_key_file_get_string(cache, ver, "type", NULL);
+    auto_gchar gchar* name = g_key_file_get_string(cache, ver, "name", NULL);
 
-    char* software = g_key_file_get_string(cache, ver, "software", NULL);
-    char* software_version = g_key_file_get_string(cache, ver, "software_version", NULL);
-    char* os = g_key_file_get_string(cache, ver, "os", NULL);
-    char* os_version = g_key_file_get_string(cache, ver, "os_version", NULL);
+    auto_gchar gchar* software = g_key_file_get_string(cache, ver, "software", NULL);
+    auto_gchar gchar* software_version = g_key_file_get_string(cache, ver, "software_version", NULL);
+    auto_gchar gchar* os = g_key_file_get_string(cache, ver, "os", NULL);
+    auto_gchar gchar* os_version = g_key_file_get_string(cache, ver, "os_version", NULL);
 
     gsize features_len = 0;
     gchar** features_list = g_key_file_get_string_list(cache, ver, "features", &features_len, NULL);
@@ -391,13 +391,6 @@ _caps_by_ver(const char* const ver)
         software, software_version, os, os_version,
         features);
 
-    g_free(category);
-    g_free(type);
-    g_free(name);
-    g_free(software);
-    g_free(software_version);
-    g_free(os);
-    g_free(os_version);
     if (features_list) {
         g_strfreev(features_list);
     }
diff --git a/src/xmpp/jid.c b/src/xmpp/jid.c
index af0a606b..745f069d 100644
--- a/src/xmpp/jid.c
+++ b/src/xmpp/jid.c
@@ -90,10 +90,9 @@ jid_create(const gchar* const str)
     if (slashp) {
         result->resourcepart = g_strdup(slashp + 1);
         result->domainpart = g_utf8_substring(domain_start, 0, g_utf8_pointer_to_offset(domain_start, slashp));
-        char* barejidraw = g_utf8_substring(trimmed, 0, g_utf8_pointer_to_offset(trimmed, slashp));
+        auto_gchar gchar* barejidraw = g_utf8_substring(trimmed, 0, g_utf8_pointer_to_offset(trimmed, slashp));
         result->barejid = g_utf8_strdown(barejidraw, -1);
         result->fulljid = g_strdup(trimmed);
-        g_free(barejidraw);
     } else {
         result->domainpart = g_strdup(domain_start);
         result->barejid = g_utf8_strdown(trimmed, -1);
@@ -189,15 +188,13 @@ create_fulljid(const char* const barejid, const char* const resource)
 char*
 get_nick_from_full_jid(const char* const full_room_jid)
 {
-    char** tokens = g_strsplit(full_room_jid, "/", 0);
+    auto_gcharv gchar** tokens = g_strsplit(full_room_jid, "/", 0);
     char* nick_part = NULL;
 
     if (tokens) {
         if (tokens[0] && tokens[1]) {
             nick_part = strdup(tokens[1]);
         }
-
-        g_strfreev(tokens);
     }
 
     return nick_part;
diff --git a/src/xmpp/message.c b/src/xmpp/message.c
index 28997474..a6372c4a 100644
--- a/src/xmpp/message.c
+++ b/src/xmpp/message.c
@@ -638,10 +638,9 @@ message_send_chat_omemo(const char* const jid, uint32_t sid, GList* keys,
 
     xmpp_stanza_t* header = xmpp_stanza_new(ctx);
     xmpp_stanza_set_name(header, "header");
-    char* sid_text = g_strdup_printf("%d", sid);
+    auto_gchar gchar* sid_text = g_strdup_printf("%d", sid);
     log_debug("[OMEMO] Sending from device sid %s", sid_text);
     xmpp_stanza_set_attribute(header, "sid", sid_text);
-    g_free(sid_text);
 
     GList* key_iter;
     for (key_iter = keys; key_iter != NULL; key_iter = key_iter->next) {
@@ -649,10 +648,9 @@ message_send_chat_omemo(const char* const jid, uint32_t sid, GList* keys,
 
         xmpp_stanza_t* key_stanza = xmpp_stanza_new(ctx);
         xmpp_stanza_set_name(key_stanza, "key");
-        char* rid = g_strdup_printf("%d", key->device_id);
+        auto_gchar gchar* rid = g_strdup_printf("%d", key->device_id);
         log_debug("[OMEMO] Sending to device rid %s", STR_MAYBE_NULL(rid));
         xmpp_stanza_set_attribute(key_stanza, "rid", rid);
-        g_free(rid);
         if (key->prekey) {
             xmpp_stanza_set_attribute(key_stanza, "prekey", "true");
         }
@@ -1625,19 +1623,16 @@ message_is_sent_by_us(const ProfMessage* const message, bool checkOID)
 
             // our client sents at CON_RAND_ID_LEN + identifier
             if (tmp_len > CON_RAND_ID_LEN) {
-                char* uuid = g_strndup(tmp_id, CON_RAND_ID_LEN);
+                auto_gchar gchar* uuid = g_strndup(tmp_id, CON_RAND_ID_LEN);
                 const char* prof_identifier = connection_get_profanity_identifier();
 
-                gchar* hmac = g_compute_hmac_for_string(G_CHECKSUM_SHA1,
-                                                        (guchar*)prof_identifier, strlen(prof_identifier),
-                                                        uuid, strlen(uuid));
+                auto_gchar gchar* hmac = g_compute_hmac_for_string(G_CHECKSUM_SHA1,
+                                                                   (guchar*)prof_identifier, strlen(prof_identifier),
+                                                                   uuid, strlen(uuid));
 
                 if (g_strcmp0(&tmp_id[CON_RAND_ID_LEN], hmac) == 0) {
                     ret = TRUE;
                 }
-
-                g_free(uuid);
-                g_free(hmac);
             }
         }
     }
diff --git a/src/xmpp/omemo.c b/src/xmpp/omemo.c
index e1bdbc3e..23c3d375 100644
--- a/src/xmpp/omemo.c
+++ b/src/xmpp/omemo.c
@@ -669,11 +669,10 @@ _omemo_bundle_publish_result(xmpp_stanza_t* const stanza, void* const userdata)
     xmpp_ctx_t* const ctx = connection_get_ctx();
     Jid* jid = jid_create(connection_get_fulljid());
     char* id = connection_create_stanza_id();
-    char* node = g_strdup_printf("%s:%d", STANZA_NS_OMEMO_BUNDLES, omemo_device_id());
+    auto_gchar gchar* node = g_strdup_printf("%s:%d", STANZA_NS_OMEMO_BUNDLES, omemo_device_id());
     log_debug("[OMEMO] node: %s", node);
 
     xmpp_stanza_t* iq = stanza_create_pubsub_configure_request(ctx, id, jid->barejid, node);
-    g_free(node);
 
     iq_id_handler_add(id, _omemo_bundle_publish_configure, NULL, userdata);
 
@@ -712,9 +711,8 @@ _omemo_bundle_publish_configure(xmpp_stanza_t* const stanza, void* const userdat
     xmpp_ctx_t* const ctx = connection_get_ctx();
     Jid* jid = jid_create(connection_get_fulljid());
     char* id = connection_create_stanza_id();
-    char* node = g_strdup_printf("%s:%d", STANZA_NS_OMEMO_BUNDLES, omemo_device_id());
+    auto_gchar gchar* node = g_strdup_printf("%s:%d", STANZA_NS_OMEMO_BUNDLES, omemo_device_id());
     xmpp_stanza_t* iq = stanza_create_pubsub_configure_submit(ctx, id, jid->barejid, node, form);
-    g_free(node);
 
     iq_id_handler_add(id, _omemo_bundle_publish_configure_result, NULL, userdata);
 
diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c
index 0fe3966c..88a7ab6c 100644
--- a/src/xmpp/stanza.c
+++ b/src/xmpp/stanza.c
@@ -2329,9 +2329,8 @@ stanza_create_omemo_devicelist_publish(xmpp_ctx_t* ctx, GList* const ids)
     for (GList* i = ids; i != NULL; i = i->next) {
         xmpp_stanza_t* device = xmpp_stanza_new(ctx);
         xmpp_stanza_set_name(device, "device");
-        char* id = g_strdup_printf("%d", GPOINTER_TO_INT(i->data));
+        auto_gchar gchar* id = g_strdup_printf("%d", GPOINTER_TO_INT(i->data));
         xmpp_stanza_set_attribute(device, "id", id);
-        g_free(id);
 
         xmpp_stanza_add_child(list, device);
         xmpp_stanza_release(device);
@@ -2366,9 +2365,8 @@ stanza_create_omemo_bundle_publish(xmpp_ctx_t* ctx, const char* const id,
 
     xmpp_stanza_t* publish = xmpp_stanza_new(ctx);
     xmpp_stanza_set_name(publish, STANZA_NAME_PUBLISH);
-    char* node = g_strdup_printf("%s:%d", "eu.siacs.conversations.axolotl.bundles", device_id);
+    auto_gchar gchar* node = g_strdup_printf("%s:%d", "eu.siacs.conversations.axolotl.bundles", device_id);
     xmpp_stanza_set_attribute(publish, STANZA_ATTR_NODE, node);
-    g_free(node);
 
     xmpp_stanza_t* item = xmpp_stanza_new(ctx);
     xmpp_stanza_set_name(item, STANZA_NAME_ITEM);
@@ -2416,9 +2414,8 @@ stanza_create_omemo_bundle_publish(xmpp_ctx_t* ctx, const char* const id,
     for (p = prekeys, i = prekeys_id, l = prekeys_length; p != NULL; p = p->next, i = i->next, l = l->next) {
         xmpp_stanza_t* prekey = xmpp_stanza_new(ctx);
         xmpp_stanza_set_name(prekey, "preKeyPublic");
-        char* id = g_strdup_printf("%d", GPOINTER_TO_INT(i->data));
+        auto_gchar gchar* id = g_strdup_printf("%d", GPOINTER_TO_INT(i->data));
         xmpp_stanza_set_attribute(prekey, "preKeyId", id);
-        g_free(id);
 
         xmpp_stanza_t* prekey_text = xmpp_stanza_new(ctx);
         char* prekey_b64 = g_base64_encode(p->data, GPOINTER_TO_INT(l->data));
@@ -2464,9 +2461,8 @@ stanza_create_omemo_bundle_request(xmpp_ctx_t* ctx, const char* const id, const
 
     xmpp_stanza_t* items = xmpp_stanza_new(ctx);
     xmpp_stanza_set_name(items, "items");
-    char* node = g_strdup_printf("%s:%d", STANZA_NS_OMEMO_BUNDLES, device_id);
+    auto_gchar gchar* node = g_strdup_printf("%s:%d", STANZA_NS_OMEMO_BUNDLES, device_id);
     xmpp_stanza_set_attribute(items, STANZA_ATTR_NODE, node);
-    g_free(node);
 
     xmpp_stanza_add_child(pubsub, items);
     xmpp_stanza_add_child(iq, pubsub);
@@ -2577,9 +2573,8 @@ stanza_create_avatar_retrieve_data_request(xmpp_ctx_t* ctx, const char* stanza_i
 
     xmpp_stanza_t* items = xmpp_stanza_new(ctx);
     xmpp_stanza_set_name(items, "items");
-    char* node = g_strdup_printf("%s", STANZA_NS_USER_AVATAR_DATA);
+    auto_gchar gchar* node = g_strdup_printf("%s", STANZA_NS_USER_AVATAR_DATA);
     xmpp_stanza_set_attribute(items, STANZA_ATTR_NODE, node);
-    g_free(node);
 
     xmpp_stanza_t* item = xmpp_stanza_new(ctx);
     xmpp_stanza_set_name(item, STANZA_NAME_ITEM);
@@ -2671,16 +2666,13 @@ stanza_create_avatar_metadata_publish_iq(xmpp_ctx_t* ctx, const char* img_data,
     xmpp_stanza_set_name(info, STANZA_NAME_INFO);
     xmpp_stanza_set_attribute(info, "id", sha1);
     xmpp_free(ctx, sha1);
-    char* bytes = g_strdup_printf("%" G_GSIZE_FORMAT, len);
-    char* h = g_strdup_printf("%d", height);
-    char* w = g_strdup_printf("%d", width);
+    auto_gchar gchar* bytes = g_strdup_printf("%" G_GSIZE_FORMAT, len);
+    auto_gchar gchar* h = g_strdup_printf("%d", height);
+    auto_gchar gchar* w = g_strdup_printf("%d", width);
     xmpp_stanza_set_attribute(info, "bytes", bytes);
     xmpp_stanza_set_attribute(info, "type", "img/png");
     xmpp_stanza_set_attribute(info, "height", h);
     xmpp_stanza_set_attribute(info, "width", w);
-    g_free(bytes);
-    g_free(h);
-    g_free(w);
 
     xmpp_stanza_add_child(metadata, info);
     xmpp_stanza_add_child(item, metadata);
@@ -2854,9 +2846,8 @@ stanza_create_mam_iq(xmpp_ctx_t* ctx, const char* const jid, const char* const s
     xmpp_stanza_set_name(max, STANZA_NAME_MAX);
 
     max_text = xmpp_stanza_new(ctx);
-    char* txt = g_strdup_printf("%d", MESSAGES_TO_RETRIEVE);
+    auto_gchar gchar* txt = g_strdup_printf("%d", MESSAGES_TO_RETRIEVE);
     xmpp_stanza_set_text(max_text, txt);
-    g_free(txt);
 
     xmpp_stanza_add_child(max, max_text);
     xmpp_stanza_add_child(set, max);