fixed memory leaks
Also avoided several NULL pointer dereferences.
This commit is contained in:
@@ -156,14 +156,23 @@ presence_sub_request_find(char * search_str)
|
||||
gboolean
|
||||
presence_sub_request_exists(const char * const bare_jid)
|
||||
{
|
||||
GSList *requests = autocomplete_get_list(sub_requests_ac);
|
||||
gboolean result = FALSE;
|
||||
GSList *requests_p = autocomplete_get_list(sub_requests_ac);
|
||||
GSList *requests = requests_p;
|
||||
|
||||
while (requests != NULL) {
|
||||
if (strcmp(requests->data, bare_jid) == 0) {
|
||||
return TRUE;
|
||||
result = TRUE;
|
||||
break;
|
||||
}
|
||||
requests = g_slist_next(requests);
|
||||
}
|
||||
return FALSE;
|
||||
|
||||
if (requests_p != NULL) {
|
||||
g_slist_free_full(requests_p, free);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -220,20 +229,28 @@ presence_update(const resource_presence_t presence_type, const char * const msg,
|
||||
static void
|
||||
_send_room_presence(xmpp_conn_t *conn, xmpp_stanza_t *presence)
|
||||
{
|
||||
GList *rooms = muc_get_active_room_list();
|
||||
GList *rooms_p = muc_get_active_room_list();
|
||||
GList *rooms = rooms_p;
|
||||
|
||||
while (rooms != NULL) {
|
||||
const char *room = rooms->data;
|
||||
const char *nick = muc_get_room_nick(room);
|
||||
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);
|
||||
if (nick != NULL) {
|
||||
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);
|
||||
}
|
||||
g_list_free(rooms);
|
||||
|
||||
if (rooms_p != NULL) {
|
||||
g_list_free(rooms_p);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -347,9 +364,13 @@ _subscribe_handler(xmpp_conn_t * const conn,
|
||||
xmpp_stanza_t * const stanza, void * const userdata)
|
||||
{
|
||||
char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
|
||||
Jid *from_jid = jid_create(from);
|
||||
log_debug("Subscribe presence handler fired for %s", from);
|
||||
|
||||
Jid *from_jid = jid_create(from);
|
||||
if (from_jid == NULL) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
prof_handle_subscription(from_jid->barejid, PRESENCE_SUBSCRIBE);
|
||||
autocomplete_add(sub_requests_ac, strdup(from_jid->barejid));
|
||||
|
||||
@@ -368,6 +389,11 @@ _unavailable_handler(xmpp_conn_t * const conn,
|
||||
|
||||
Jid *my_jid = jid_create(jid);
|
||||
Jid *from_jid = jid_create(from);
|
||||
if (my_jid == NULL || from_jid == NULL) {
|
||||
jid_destroy(my_jid);
|
||||
jid_destroy(from_jid);
|
||||
return 1;
|
||||
}
|
||||
|
||||
char *status_str = stanza_get_status(stanza, NULL);
|
||||
|
||||
@@ -420,6 +446,11 @@ _available_handler(xmpp_conn_t * const conn,
|
||||
|
||||
Jid *my_jid = jid_create(jid);
|
||||
Jid *from_jid = jid_create(from);
|
||||
if (my_jid == NULL || from_jid == NULL) {
|
||||
jid_destroy(my_jid);
|
||||
jid_destroy(from_jid);
|
||||
return 1;
|
||||
}
|
||||
|
||||
char *show_str = stanza_get_show(stanza, "online");
|
||||
char *status_str = stanza_get_status(stanza, NULL);
|
||||
@@ -515,6 +546,10 @@ _get_caps_key(xmpp_stanza_t * const stanza)
|
||||
|
||||
log_debug("Presence contains capabilities.");
|
||||
|
||||
if (node == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// xep-0115
|
||||
if ((hash_type != NULL) && (strcmp(hash_type, "sha-1") == 0)) {
|
||||
log_debug("Hash type %s supported.", hash_type);
|
||||
@@ -544,6 +579,8 @@ _get_caps_key(xmpp_stanza_t * const stanza)
|
||||
g_string_free(id_str, TRUE);
|
||||
}
|
||||
|
||||
g_free(node);
|
||||
|
||||
return caps_key;
|
||||
}
|
||||
|
||||
@@ -626,6 +663,7 @@ _room_presence_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
|
||||
if (old_nick != NULL) {
|
||||
muc_add_to_roster(room, nick, show_str, status_str, caps_key);
|
||||
prof_handle_room_member_nick_change(room, old_nick, nick);
|
||||
free(old_nick);
|
||||
} else {
|
||||
if (!muc_nick_in_roster(room, nick)) {
|
||||
prof_handle_room_member_online(room, nick, show_str, status_str, caps_key);
|
||||
|
||||
Reference in New Issue
Block a user