view doc/xfer-signals.dox @ 31518:b39b6d0008c5

upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387 I have no idea if this will resolve the crashes, but with the help of the packet capture, I /think/ these are correct. Short summary: it's possible for the callback to fire (and ar be freed) before the top-level function (purple_upnp_cancel_port_mapping) returns, even though cancel_port_mapping returns the now-invalid ar (which may lead to a subsequent use-after-free). At least one call path through the code that I think leads to this (backed up by one of the debug logs I looked at): purple_upnp_cancel_port_mapping(...) do_port_mapping_cb (has_control_mapping == TRUE, ar->add == FALSE) purple_upnp_generate_action_message_and_send(..., done_port_mapping_cb, ar) /* We fail to parse the URL (see some debug logs) */ done_port_mapping_cb ar->cb(FALSE, cbdata) return; return; return; return ar; ...and something which calls: do_port_mapping_cb(has_control_mapping == TRUE, ar->add == TRUE) ar->cb(FALSE, cbdata) g_free(ar) return;
author Paul Aurich <paul@darkrain42.org>
date Tue, 28 Dec 2010 05:37:20 +0000
parents e0613cf8c493
children
line wrap: on
line source

/** @page xfer-signals File Transfer Signals

 @signals
  @signal file-recv-accept
  @signal file-recv-start
  @signal file-recv-cancel
  @signal file-recv-complete
  @signal file-recv-request
  @signal file-send-accept
  @signal file-send-start
  @signal file-send-cancel
  @signal file-send-complete
 @endsignals

 @see ft.h

 <hr>

 @signaldef file-recv-accept
  @signalproto
void (*file_recv_accept)(PurpleXfer *xfer, gpointer data);
  @endsignalproto
  @signaldesc
   Emitted when an incoming file transfer has been accepted.
  @param xfer The file transfer
  @param data User data
 @endsignaldef

 @signaldef file-recv-start
  @signalproto
void (*file_recv_start)(PurpleXfer *xfer, gpointer data);
  @endsignalproto
  @signaldesc
   Emitted when an incoming file transfer has been started.
  @param xfer The file transfer
  @param data User data
 @endsignaldef

 @signaldef file-recv-cancel
  @signalproto
void (*file_recv_cancel)(PurpleXfer *xfer, gpointer data);
  @endsignalproto
  @signaldesc
   Emitted when an incoming file transfer has been canceled.
  @param xfer The file transfer
  @param data User data
 @endsignaldef

 @signaldef file-recv-complete
  @signalproto
void (*file_recv_complete)(PurpleXfer *xfer, gpointer data);
  @endsignalproto
  @signaldesc
   Emitted when an incoming file transfer has been completed.
  @param xfer The file transfer
  @param data User data
 @endsignaldef

 @signaldef file-recv-request
  @signalproto
void (*file_recv_request)(PurpleXfer *xfer, gpointer data);
  @endsignalproto
  @signaldesc
   Emitted before the user is prompted for an incoming file-transfer.
   Plugins can intercept the signal to auto-accept/auto-reject the
   requests. To auto-accept the file transfer, use
   purple_xfer_request_accepted(). To auto-reject, set the status of the
   xfer to PURPLE_XFER_STATUS_CANCEL_LOCAL.
  @param xfer The file transfer
  @param data User data
 @endsignaldef

 @signaldef file-send-accept
  @signalproto
void (*file_send_accept)(PurpleXfer *xfer, gpointer data);
  @endsignalproto
  @signaldesc
   Emitted when an outgoing file transfer has been accepted.
  @param xfer The file transfer
  @param data User data
 @endsignaldef

 @signaldef file-send-start
  @signalproto
void (*file_send_start)(PurpleXfer *xfer, gpointer data);
  @endsignalproto
  @signaldesc
   Emitted when an outgoing file transfer has started.
  @param xfer The file transfer
  @param data User data
 @endsignaldef

 @signaldef file-send-cancel
  @signalproto
void (*file_send_cancel)(PurpleXfer *xfer, gpointer data);
  @endsignalproto
  @signaldesc
   Emitted when an outgoing file transfer has been canceled.
  @param xfer The file transfer
  @param data User data
 @endsignaldef

 @signaldef file-send-complete
  @signalproto
void (*file_send_complete)(PurpleXfer *xfer, gpointer data);
  @endsignalproto
  @signaldesc
   Emitted when an outgoing file transfer has been completed.
  @param xfer The file transfer
  @param data User data
 @endsignaldef

 */
// vim: syntax=c.doxygen tw=75 et