# HG changeset patch # User Elliott Sales de Andrade # Date 1218166468 0 # Node ID 8552b19acbce7a69f7cbbd06651af8d3d98f5397 # Parent da592864cae2d92291fc983476c6cdb8c4c45f6f Re-arrange msn_session_destroy to avoid use-after-free bugs. I don't think this will actually fix anything, but maybe it does. diff -r da592864cae2 -r 8552b19acbce libpurple/protocols/msn/session.c --- a/libpurple/protocols/msn/session.c Fri Aug 08 02:26:25 2008 +0000 +++ b/libpurple/protocols/msn/session.c Fri Aug 08 03:34:28 2008 +0000 @@ -57,17 +57,35 @@ session->destroying = TRUE; - if (session->connected) - msn_session_disconnect(session); + if (session->soap_cleanup_handle) + purple_timeout_remove(session->soap_cleanup_handle); + + if (session->soap_table != NULL) + g_hash_table_destroy(session->soap_table); + + while (session->slplinks != NULL) + msn_slplink_destroy(session->slplinks->data); + + while (session->switches != NULL) + msn_switchboard_destroy(session->switches->data); + + if (session->sync != NULL) + msn_sync_destroy(session->sync); + + if (session->oim != NULL) + msn_oim_destroy(session->oim); + + if (session->nexus != NULL) + msn_nexus_destroy(session->nexus); + + if (session->user != NULL) + msn_user_destroy(session->user); if (session->notification != NULL) msn_notification_destroy(session->notification); - while (session->switches != NULL) - msn_switchboard_destroy(session->switches->data); - - while (session->slplinks != NULL) - msn_slplink_destroy(session->slplinks->data); + if (session->connected) + msn_session_disconnect(session); msn_userlist_destroy(session->userlist); @@ -79,27 +97,8 @@ g_free(session->passport_info.sid); g_free(session->passport_info.mspauth); g_free(session->passport_info.client_ip); - g_free(session->passport_info.mail_url); - if (session->sync != NULL) - msn_sync_destroy(session->sync); - - if (session->nexus != NULL) - msn_nexus_destroy(session->nexus); - - if (session->oim != NULL) - msn_oim_destroy(session->oim); - - if (session->user != NULL) - msn_user_destroy(session->user); - - if (session->soap_table != NULL) - g_hash_table_destroy(session->soap_table); - - if (session->soap_cleanup_handle) - purple_timeout_remove(session->soap_cleanup_handle); - g_free(session); }