comparison libpurple/protocols/msn/msn.c @ 30174:b0bc67f42027

Fix a possible use-after-free. If the user initiated a file transfer while a display pic transfer was in progress, and that transfer finished before the user selected a file, then the MsnSlpLink to that user could be used after it's freed. Also, if there were a conversation open to that user, then the slplink would not be freed, so the FT must be started from the buddy list. Fixes #6453.
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Tue, 20 Apr 2010 00:05:34 +0000
parents 29df7408df03
children 06fa97f637a7 2a436e0ce977 7a26ff6c0044
comparison
equal deleted inserted replaced
30173:4ebecacf2fbb 30174:b0bc67f42027
587 static void 587 static void
588 t_msn_xfer_init(PurpleXfer *xfer) 588 t_msn_xfer_init(PurpleXfer *xfer)
589 { 589 {
590 MsnSlpLink *slplink = xfer->data; 590 MsnSlpLink *slplink = xfer->data;
591 msn_slplink_request_ft(slplink, xfer); 591 msn_slplink_request_ft(slplink, xfer);
592 msn_slplink_unref(slplink);
593 }
594
595 static void
596 t_msn_xfer_cancel_send(PurpleXfer *xfer)
597 {
598 MsnSlpLink *slplink = xfer->data;
599 msn_slplink_unref(slplink);
592 } 600 }
593 601
594 static PurpleXfer* 602 static PurpleXfer*
595 msn_new_xfer(PurpleConnection *gc, const char *who) 603 msn_new_xfer(PurpleConnection *gc, const char *who)
596 { 604 {
601 609
602 xfer = purple_xfer_new(gc->account, PURPLE_XFER_SEND, who); 610 xfer = purple_xfer_new(gc->account, PURPLE_XFER_SEND, who);
603 611
604 g_return_val_if_fail(xfer != NULL, NULL); 612 g_return_val_if_fail(xfer != NULL, NULL);
605 613
606 xfer->data = msn_session_get_slplink(session, who); 614 xfer->data = msn_slplink_ref(msn_session_get_slplink(session, who));
607 615
608 purple_xfer_set_init_fnc(xfer, t_msn_xfer_init); 616 purple_xfer_set_init_fnc(xfer, t_msn_xfer_init);
617 purple_xfer_set_cancel_send_fnc(xfer, t_msn_xfer_cancel_send);
609 618
610 return xfer; 619 return xfer;
611 } 620 }
612 621
613 static void 622 static void