Mercurial > pidgin.yaz
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 |