# HG changeset patch # User Mark Doliner # Date 1153380675 0 # Node ID 99b9b58b19ddd3af000682cddfeef8f60b2a5e57 # Parent 80cbf6c2d5629407d91b7fbe3486218e9768a943 [gaim-migrate @ 16523] Fix a crazy MSN crash. Basically it's possible to have more than one slplink associated with a given switchboard, but our code did not allow for that. I think it happens when you're in a multi-user chat and you do stuff with multiple users that involves slplinks. Like maybe file transfer and buddy icon related stuff. Tracking this down took an ungodly amount of time, but thanks to Meebo for letting me do it :-) committer: Tailor Script diff -r 80cbf6c2d562 -r 99b9b58b19dd src/protocols/msn/slp.c --- a/src/protocols/msn/slp.c Wed Jul 19 23:52:01 2006 +0000 +++ b/src/protocols/msn/slp.c Thu Jul 20 07:31:15 2006 +0000 @@ -748,7 +748,7 @@ * reporting bugs. Hopefully this doesn't cause more crashes. Stu. */ if (slplink->swboard != NULL) - slplink->swboard->slplink = slplink; + slplink->swboard->slplinks = g_list_prepend(slplink->swboard->slplinks, slplink); else gaim_debug_error("msn", "msn_p2p_msg, swboard is NULL, ouch!\n"); } diff -r 80cbf6c2d562 -r 99b9b58b19dd src/protocols/msn/slplink.c --- a/src/protocols/msn/slplink.c Wed Jul 19 23:52:01 2006 +0000 +++ b/src/protocols/msn/slplink.c Thu Jul 20 07:31:15 2006 +0000 @@ -102,7 +102,7 @@ g_return_if_fail(slplink != NULL); if (slplink->swboard != NULL) - slplink->swboard->slplink = NULL; + slplink->swboard->slplinks = g_list_remove(slplink->swboard->slplinks, slplink); session = slplink->session; @@ -256,7 +256,7 @@ return; /* If swboard is destroyed we will be too */ - slplink->swboard->slplink = slplink; + slplink->swboard->slplinks = g_list_prepend(slplink->swboard->slplinks, slplink); } msn_switchboard_send_msg(slplink->swboard, msg, TRUE); diff -r 80cbf6c2d562 -r 99b9b58b19dd src/protocols/msn/switchboard.c --- a/src/protocols/msn/switchboard.c Wed Jul 19 23:52:01 2006 +0000 +++ b/src/protocols/msn/switchboard.c Thu Jul 20 07:31:15 2006 +0000 @@ -82,8 +82,8 @@ swboard->destroying = TRUE; /* If it linked us is because its looking for trouble */ - if (swboard->slplink != NULL) - msn_slplink_destroy(swboard->slplink); + while (swboard->slplinks != NULL) + msn_slplink_destroy(swboard->slplinks->data); /* Destroy the message queue */ while ((msg = g_queue_pop_head(swboard->msg_queue)) != NULL) diff -r 80cbf6c2d562 -r 99b9b58b19dd src/protocols/msn/switchboard.h --- a/src/protocols/msn/switchboard.h Wed Jul 19 23:52:01 2006 +0000 +++ b/src/protocols/msn/switchboard.h Thu Jul 20 07:31:15 2006 +0000 @@ -102,7 +102,7 @@ MsnSBErrorType error; /**< The error that occurred in this switchboard (if applicable). */ - MsnSlpLink *slplink; /**< The slplink that is using this switchboard. */ + GList *slplinks; /**< The list of slplinks that are using this switchboard. */ }; /**