From cc219ecc36a0a1fcf05e05b20c097904cfb17b06 Mon Sep 17 00:00:00 2001 From: Vinicius Costa Gomes Date: Thu, 6 Nov 2008 12:11:17 -0300 Subject: [PATCH] obexd: Removes memory leaks when the transfer ends --- obexd/client/session.c | 65 ++++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/obexd/client/session.c b/obexd/client/session.c index 85425e517..b24f32f59 100644 --- a/obexd/client/session.c +++ b/obexd/client/session.c @@ -479,6 +479,7 @@ static void agent_notify_complete(DBusConnection *conn, const char *agent_name, DBUS_TYPE_INVALID); g_dbus_send_message(conn, message); + } static void agent_notify_error(DBusConnection *conn, const char *agent_name, @@ -811,6 +812,35 @@ static const GMarkupParser parser = { NULL }; +static char *register_transfer(DBusConnection *conn, void *user_data) +{ + char *path; + + path = g_strdup_printf("%s/transfer%ju", + TRANSFER_BASEPATH, counter++); + + if (g_dbus_register_interface(conn, path, + TRANSFER_INTERFACE, + transfer_methods, NULL, NULL, + user_data, NULL) == FALSE) { + g_free(path); + return NULL; + } + + return path; +} + +static void unregister_transfer(struct session_data *session) +{ + if (session->transfer_path == NULL) + return; + + g_dbus_unregister_interface(session->conn, + session->transfer_path, TRANSFER_INTERFACE); + g_free(session->transfer_path); + session->transfer_path = NULL; +} + static void list_folder_callback(struct session_data *session, void *user_data) { @@ -916,10 +946,18 @@ complete: session->agent_path, session->transfer_path, "Error getting object"); + unregister_transfer(session); + gw_obex_xfer_close(xfer, NULL); gw_obex_xfer_free(xfer); callback->session->xfer = NULL; + g_free(session->filename); + session->filename = NULL; + + g_free(session->name); + session->name = NULL; + callback->func(callback->session, callback->data); if (session->fd > 0) @@ -930,24 +968,6 @@ complete: g_free(callback); } -static char *register_transfer(DBusConnection *conn, void *user_data) -{ - char *path; - - path = g_strdup_printf("%s/transfer%ju", - TRANSFER_BASEPATH, counter++); - - if (g_dbus_register_interface(conn, path, - TRANSFER_INTERFACE, - transfer_methods, NULL, NULL, - user_data, NULL) == FALSE) { - g_free(path); - return NULL; - } - - return path; -} - int session_get(struct session_data *session, const char *type, const char *filename, const char *targetname, session_callback_t func) @@ -1223,6 +1243,8 @@ complete: session->agent_path, session->transfer_path, "Error sending object"); + unregister_transfer(session); + gw_obex_xfer_close(session->xfer, NULL); gw_obex_xfer_free(session->xfer); session->xfer = NULL; @@ -1239,13 +1261,6 @@ complete: g_ptr_array_remove(session->pending, filename); - if (session->transfer_path) { - g_dbus_unregister_interface(session->conn, - session->transfer_path, TRANSFER_INTERFACE); - g_free(session->transfer_path); - session->transfer_path = NULL; - } - session_send(session, filename, basename); g_free(filename); g_free(basename); -- 2.47.3