Mercurial > pidgin
comparison libpurple/protocols/jabber/jingle/session.c @ 32380:231c9635b82a
Fix crashes and memory leaks when receiving malformed voice
and video requests. Thanks to Thijs Alkemade for reporting this!
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Tue, 06 Dec 2011 07:06:01 +0000 |
parents | c9da7f5fbd0e |
children |
comparison
equal
deleted
inserted
replaced
32379:76b7754ba906 | 32380:231c9635b82a |
---|---|
286 | 286 |
287 /* insert it into the hash table */ | 287 /* insert it into the hash table */ |
288 if (!js->sessions) { | 288 if (!js->sessions) { |
289 purple_debug_info("jingle", | 289 purple_debug_info("jingle", |
290 "Creating hash table for sessions\n"); | 290 "Creating hash table for sessions\n"); |
291 js->sessions = g_hash_table_new(g_str_hash, g_str_equal); | 291 js->sessions = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); |
292 } | 292 } |
293 purple_debug_info("jingle", | 293 purple_debug_info("jingle", |
294 "inserting session with key: %s into table\n", sid); | 294 "inserting session with key: %s into table\n", sid); |
295 g_hash_table_insert(js->sessions, g_strdup(sid), session); | 295 g_hash_table_insert(js->sessions, g_strdup(sid), session); |
296 | 296 |
409 xmlnode *jingle = iq ? | 409 xmlnode *jingle = iq ? |
410 xmlnode_new_child(iq->node, "jingle") : | 410 xmlnode_new_child(iq->node, "jingle") : |
411 xmlnode_new("jingle"); | 411 xmlnode_new("jingle"); |
412 gchar *local_jid = jingle_session_get_local_jid(session); | 412 gchar *local_jid = jingle_session_get_local_jid(session); |
413 gchar *remote_jid = jingle_session_get_remote_jid(session); | 413 gchar *remote_jid = jingle_session_get_remote_jid(session); |
414 gchar *sid = jingle_session_get_sid(session); | |
414 | 415 |
415 xmlnode_set_namespace(jingle, JINGLE); | 416 xmlnode_set_namespace(jingle, JINGLE); |
416 xmlnode_set_attrib(jingle, "action", jingle_get_action_name(action)); | 417 xmlnode_set_attrib(jingle, "action", jingle_get_action_name(action)); |
417 | 418 |
418 if (jingle_session_is_initiator(session)) { | 419 if (jingle_session_is_initiator(session)) { |
419 xmlnode_set_attrib(jingle, "initiator", | 420 xmlnode_set_attrib(jingle, "initiator", local_jid); |
420 jingle_session_get_local_jid(session)); | 421 xmlnode_set_attrib(jingle, "responder", remote_jid); |
421 xmlnode_set_attrib(jingle, "responder", | |
422 jingle_session_get_remote_jid(session)); | |
423 } else { | 422 } else { |
424 xmlnode_set_attrib(jingle, "initiator", | 423 xmlnode_set_attrib(jingle, "initiator", remote_jid); |
425 jingle_session_get_remote_jid(session)); | 424 xmlnode_set_attrib(jingle, "responder", local_jid); |
426 xmlnode_set_attrib(jingle, "responder", | 425 } |
427 jingle_session_get_local_jid(session)); | 426 |
428 } | 427 xmlnode_set_attrib(jingle, "sid", sid); |
429 | 428 |
430 g_free(local_jid); | 429 g_free(local_jid); |
431 g_free(remote_jid); | 430 g_free(remote_jid); |
432 | 431 g_free(sid); |
433 xmlnode_set_attrib(jingle, "sid", jingle_session_get_sid(session)); | |
434 | 432 |
435 return jingle; | 433 return jingle; |
436 } | 434 } |
437 | 435 |
438 JabberIq * | 436 JabberIq * |
506 } | 504 } |
507 | 505 |
508 JingleContent * | 506 JingleContent * |
509 jingle_session_find_content(JingleSession *session, const gchar *name, const gchar *creator) | 507 jingle_session_find_content(JingleSession *session, const gchar *name, const gchar *creator) |
510 { | 508 { |
511 GList *iter = session->priv->contents; | 509 GList *iter; |
510 | |
511 if (name == NULL) | |
512 return NULL; | |
513 | |
514 iter = session->priv->contents; | |
512 for (; iter; iter = g_list_next(iter)) { | 515 for (; iter; iter = g_list_next(iter)) { |
513 JingleContent *content = iter->data; | 516 JingleContent *content = iter->data; |
514 gchar *cname = jingle_content_get_name(content); | 517 gchar *cname = jingle_content_get_name(content); |
515 gboolean result = !strcmp(name, cname); | 518 gboolean result = g_str_equal(name, cname); |
516 g_free(cname); | 519 g_free(cname); |
517 | 520 |
518 if (creator != NULL) { | 521 if (creator != NULL) { |
519 gchar *ccreator = jingle_content_get_creator(content); | 522 gchar *ccreator = jingle_content_get_creator(content); |
520 result = (result && !strcmp(creator, ccreator)); | 523 result = (result && !strcmp(creator, ccreator)); |
528 } | 531 } |
529 | 532 |
530 JingleContent * | 533 JingleContent * |
531 jingle_session_find_pending_content(JingleSession *session, const gchar *name, const gchar *creator) | 534 jingle_session_find_pending_content(JingleSession *session, const gchar *name, const gchar *creator) |
532 { | 535 { |
533 GList *iter = session->priv->pending_contents; | 536 GList *iter; |
537 | |
538 if (name == NULL) | |
539 return NULL; | |
540 | |
541 iter = session->priv->pending_contents; | |
534 for (; iter; iter = g_list_next(iter)) { | 542 for (; iter; iter = g_list_next(iter)) { |
535 JingleContent *content = iter->data; | 543 JingleContent *content = iter->data; |
536 gchar *cname = jingle_content_get_name(content); | 544 gchar *cname = jingle_content_get_name(content); |
537 gboolean result = !strcmp(name, cname); | 545 gboolean result = g_str_equal(name, cname); |
538 g_free(cname); | 546 g_free(cname); |
539 | 547 |
540 if (creator != NULL) { | 548 if (creator != NULL) { |
541 gchar *ccreator = jingle_content_get_creator(content); | 549 gchar *ccreator = jingle_content_get_creator(content); |
542 result = (result && !strcmp(creator, ccreator)); | 550 result = (result && !strcmp(creator, ccreator)); |