Hello Gustavo, Le 04/02/2011 19:08, Gustavo F. Padovan a écrit : > Hi Frédéric, > > * Frédéric Danis [2011-02-04 15:44:04 +0100]: > >> --- >> plugins/bluetooth.c | 125 ++++++++++++++++++++++++++++++++++++++++++++++---- >> 1 files changed, 115 insertions(+), 10 deletions(-) >> >> diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c >> index b489dad..8d28b07 100644 >> --- a/plugins/bluetooth.c >> +++ b/plugins/bluetooth.c >> @@ -44,6 +44,8 @@ static GHashTable *adapter_address_hash = NULL; >> static gint bluetooth_refcount; >> static GSList *server_list = NULL; >> >> +#define TIMEOUT (60) /* Timeout for user response (seconds) */ >> + >> struct server { >> guint8 channel; >> char *sdp_record; >> @@ -58,6 +60,8 @@ struct cb_data { >> struct server *server; >> char *path; >> guint source; >> + GIOChannel *io; >> + gboolean pending_auth; >> }; >> >> void bluetooth_create_path(const char *dev_addr, const char *adapter_addr, >> @@ -483,26 +487,104 @@ static void cb_data_destroy(gpointer data) >> g_free(cb_data); >> } >> >> +static void cancel_authorization(struct cb_data *user_data) >> +{ >> + DBusMessage *msg; >> + >> + if (user_data->path == NULL) >> + return; >> + >> + msg = dbus_message_new_method_call(BLUEZ_SERVICE, user_data->path, >> + BLUEZ_SERVICE_INTERFACE, >> + "CancelAuthorization"); >> + >> + if (msg == NULL) { >> + ofono_error("Unable to allocate D-Bus CancelAuthorization" >> + " message"); >> + return; >> + } >> + >> + g_dbus_send_message(connection, msg); >> +} >> + >> static gboolean client_event(GIOChannel *chan, GIOCondition cond, gpointer data) >> { >> struct cb_data *cb_data = data; >> struct server *server = cb_data->server; >> >> - server->client_list = g_slist_remove(server->client_list, >> + if (cb_data->pending_auth == TRUE) { >> + cancel_authorization(cb_data); >> + >> + cb_data->pending_auth = FALSE; >> + } else { >> + server->client_list = g_slist_remove(server->client_list, >> GUINT_TO_POINTER(cb_data->source)); >> >> - cb_data_destroy(cb_data); >> + cb_data_destroy(cb_data); >> + } > > Don't you have to call g_slist_remove and cb_data_destroy for both cases? when > pending_auth is TRUE or FALSE. In case of socket disconnection during authorization phase (if user do not perform any action in authorization dialog), if g_slist_remove and cb_data_destroy are called here we will get a crash when auth_cb will be called with an error (as we will try to call both functions on already freed memory). This is why I let auth_cb in charge of removing source from the list and freeing memory during authorization phase. Regards Fred -- Frederic Danis Open Source Technology Centre frederic.danis(a)intel.com Intel Corporation