about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/xmpp/presence.c12
-rw-r--r--src/xmpp/stanza.c32
2 files changed, 37 insertions, 7 deletions
diff --git a/src/xmpp/presence.c b/src/xmpp/presence.c
index 5aa94c1d..f072196d 100644
--- a/src/xmpp/presence.c
+++ b/src/xmpp/presence.c
@@ -224,11 +224,12 @@ _send_room_presence(xmpp_conn_t *conn, xmpp_stanza_t *presence)
     while (rooms != NULL) {
         const char *room = rooms->data;
         const char *nick = muc_get_room_nick(room);
-        const char *full_room_jid = create_fulljid(room, nick);
+        char *full_room_jid = create_fulljid(room, nick);
 
         xmpp_stanza_set_attribute(presence, STANZA_ATTR_TO, full_room_jid);
         log_debug("Sending presence to room: %s", full_room_jid);
         xmpp_send(conn, presence);
+        free(full_room_jid);
 
         rooms = g_list_next(rooms);
     }
@@ -384,6 +385,7 @@ _unavailable_handler(xmpp_conn_t * const conn,
         }
     }
 
+    FREE_SET_NULL(status_str);
     jid_destroy(my_jid);
     jid_destroy(from_jid);
 
@@ -469,6 +471,8 @@ _available_handler(xmpp_conn_t * const conn,
             last_activity);
     }
 
+    FREE_SET_NULL(status_str);
+    FREE_SET_NULL(show_str);
     jid_destroy(my_jid);
     jid_destroy(from_jid);
 
@@ -529,7 +533,7 @@ _get_caps_key(xmpp_stanza_t * const stanza)
 
         guint from_hash = g_str_hash(from);
         char from_hash_str[9];
-        g_sprintf(from_hash_str, "%08x", from_hash);
+        g_snprintf(from_hash_str, sizeof(from_hash_str), "%08x", from_hash);
         caps_key = strdup(from_hash_str);
         GString *id_str = g_string_new("capsreq_");
         g_string_append(id_str, from_hash_str);
@@ -626,7 +630,11 @@ _room_presence_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
                     }
                 }
             }
+
+           FREE_SET_NULL(show_str);
         }
+
+        FREE_SET_NULL(status_str);
     }
 
     jid_destroy(my_jid);
diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c
index 91ce10b7..a5b7788a 100644
--- a/src/xmpp/stanza.c
+++ b/src/xmpp/stanza.c
@@ -383,26 +383,48 @@ stanza_get_delay(xmpp_stanza_t * const stanza, GTimeVal *tv_stamp)
 char *
 stanza_get_status(xmpp_stanza_t *stanza, char *def)
 {
+    xmpp_ctx_t *ctx = connection_get_ctx();
     xmpp_stanza_t *status =
         xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_STATUS);
 
     if (status != NULL) {
-        return xmpp_stanza_get_text(status);
+        // xmpp_free and free may be different functions so convert all to
+        // libc malloc
+        char *s1, *s2 = NULL;
+        s1 = xmpp_stanza_get_text(status);
+        if (s1 != NULL) {
+            s2 = strdup(s1);
+            xmpp_free(ctx, s1);
+        }
+        return s2;
+    } else if (def != NULL) {
+        return strdup(def);
     } else {
-        return def;
+        return NULL;
     }
 }
 
 char *
 stanza_get_show(xmpp_stanza_t *stanza, char *def)
 {
+    xmpp_ctx_t *ctx = connection_get_ctx();
     xmpp_stanza_t *show =
         xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_SHOW);
 
     if (show != NULL) {
-        return xmpp_stanza_get_text(show);
+        // xmpp_free and free may be different functions so convert all to
+        // libc malloc
+        char *s1, *s2 = NULL;
+        s1 = xmpp_stanza_get_text(show);
+        if (s1 != NULL) {
+            s2 = strdup(s1);
+            xmpp_free(ctx, s1);
+        }
+        return s2;
+    } else if (def != NULL) {
+        return strdup(def);
     } else {
-        return def;
+        return NULL;
     }
 }
 
@@ -730,7 +752,7 @@ stanza_create_form(xmpp_stanza_t * const stanza)
             xmpp_stanza_t *value = xmpp_stanza_get_child_by_name(child, "value");
             char *value_text = xmpp_stanza_get_text(value);
             result->form_type = strdup(value_text);
-	    xmpp_free(ctx, value_text);
+            xmpp_free(ctx, value_text);
 
         // handle regular fields
         } else {