Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix memory leaks and other bugs #48

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
4 changes: 2 additions & 2 deletions src/bt-device.c
Original file line number Diff line number Diff line change
Expand Up @@ -331,9 +331,9 @@ static GHashTable *_bt_device_sdp_browse(const gchar *device_path, const gchar *
}

if(pattern == NULL || strlen(pattern) == 0)
execl("/bin/sdptool", "/bin/sdptool", "browse", "--xml", device_path, (char *) 0);
execlp("sdptool", "sdptool", "browse", "--xml", device_path, (char *) 0);
else
execl("/bin/sdptool", "/bin/sdptool", "browse", "--xml", "--uuid", pattern, device_path, (char *) 0);
execlp("sdptool", "sdptool", "browse", "--xml", "--uuid", pattern, device_path, (char *) 0);

}
if(pid == -1)
Expand Down
124 changes: 68 additions & 56 deletions src/bt-obex.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,14 @@ struct _ObexTransferInfo {
gchar *status;
};

static void obex_transfer_info_free(ObexTransferInfo* info)
{
g_free(info->filename);
g_free(info->obex_root);
g_free(info->status);
g_free(info);
}

static void sigterm_handler(int sig)
{
g_message("%s received", sig == SIGTERM ? "SIGTERM" : "SIGINT");
Expand All @@ -70,25 +78,40 @@ static void _obex_server_object_manager_handler(GDBusConnection *connection, con
const gchar *interface_object_path = g_variant_get_string(g_variant_get_child_value(parameters, 0), NULL);
GVariant *interfaces_and_properties = g_variant_get_child_value(parameters, 1);
GVariant *properties = NULL;

if(g_variant_lookup(interfaces_and_properties, OBEX_TRANSFER_DBUS_INTERFACE, "@a{sv}", &properties))
{
g_print("[OBEX Server] Transfer started\n");
ObexTransfer *t = obex_transfer_new(interface_object_path);
g_hash_table_insert(_transfers, g_strdup(interface_object_path), t);


GVariant* size_variant = g_variant_lookup_value(properties, "Size", NULL);
GVariant* status_variant = g_variant_lookup_value(properties, "Status", NULL);
GVariant* session_variant = g_variant_lookup_value(properties, "Session", NULL);

ObexTransferInfo *info = g_malloc0(sizeof(ObexTransferInfo));
info->filesize = g_variant_get_uint64(g_variant_lookup_value(properties, "Size", NULL));
info->status = g_strdup(g_variant_get_string(g_variant_lookup_value(properties, "Status", NULL), NULL));
ObexSession *session = obex_session_new(g_variant_get_string(g_variant_lookup_value(properties, "Session", NULL), NULL));

info->status = g_strdup(g_variant_get_string(status_variant, NULL));

ObexSession *session = obex_session_new(g_variant_get_string(session_variant, NULL));
info->obex_root = g_strdup(obex_session_get_root(session, NULL));

g_object_unref(session);

if (size_variant != NULL)
{
info->filesize = g_variant_get_uint64(size_variant);
g_variant_unref(size_variant);
}
else
{
info->filesize = 0;
}

g_variant_unref(status_variant);
g_variant_unref(session_variant);

g_hash_table_insert(_transfer_infos, g_strdup(interface_object_path), info);
}

if(g_variant_lookup(interfaces_and_properties, OBEX_SESSION_DBUS_INTERFACE, "@a{sv}", &properties))
{
g_print("[OBEX Server] OBEX session opened\n");
Expand All @@ -110,10 +133,7 @@ static void _obex_server_object_manager_handler(GDBusConnection *connection, con
if(g_strcmp0(*inf, OBEX_TRANSFER_DBUS_INTERFACE) == 0)
{
g_print("[OBEX Server] OBEX transfer closed\n");
ObexTransfer *transfer = g_hash_table_lookup(_transfers, interface_object_path);
g_hash_table_remove(_transfers, interface_object_path);
g_object_unref(transfer);
g_free(g_hash_table_lookup(_transfer_infos, interface_object_path));
g_hash_table_remove(_transfer_infos, interface_object_path);
}

Expand Down Expand Up @@ -177,7 +197,12 @@ static void _obex_server_properties_handler(GDBusConnection *connection, const g
{
g_print("[OBEX Server] Transfer succeeded\n");
ObexTransferInfo *info = g_hash_table_lookup(_transfer_infos, object_path);
g_rename(g_build_filename(info->obex_root, info->filename, NULL), g_build_filename(_root_path, info->filename, NULL));

gchar* old_name = g_build_filename(info->obex_root, info->filename, NULL);
gchar* new_name = g_build_filename(_root_path, info->filename, NULL);
g_rename(old_name, new_name);
g_free(old_name);
g_free(new_name);
}
else if(g_strcmp0(status, "error") == 0)
{
Expand All @@ -202,7 +227,8 @@ static void _obex_opp_client_object_manager_handler(GDBusConnection *connection,
{
if(g_strcmp0(signal_name, "InterfacesAdded") == 0)
{
const gchar *interface_object_path = g_variant_get_string(g_variant_get_child_value(parameters, 0), NULL);
GVariant* interface_value = g_variant_get_child_value(parameters, 0);
const gchar *interface_object_path = g_variant_get_string(interface_value, NULL);
GVariant *interfaces_and_properties = g_variant_get_child_value(parameters, 1);
GVariant *properties = NULL;

Expand All @@ -213,15 +239,24 @@ static void _obex_opp_client_object_manager_handler(GDBusConnection *connection,
g_hash_table_insert(_transfers, g_strdup(interface_object_path), t);

ObexTransferInfo *info = g_malloc0(sizeof(ObexTransferInfo));
info->filesize = g_variant_get_uint64(g_variant_lookup_value(properties, "Size", NULL));
info->filename = g_strdup(g_variant_get_string(g_variant_lookup_value(properties, "Name", NULL), NULL));
info->status = g_strdup(g_variant_get_string(g_variant_lookup_value(properties, "Status", NULL), NULL));
ObexSession *session = obex_session_new(g_variant_get_string(g_variant_lookup_value(properties, "Session", NULL), NULL));


GVariant* size_variant = g_variant_lookup_value(properties, "Size", NULL);
GVariant* name_variant = g_variant_lookup_value(properties, "Name", NULL);
GVariant* status_variant = g_variant_lookup_value(properties, "Status", NULL);
GVariant* session_variant = g_variant_lookup_value(properties, "Session", NULL);

info->filesize = g_variant_get_uint64(size_variant);
info->filename = g_variant_dup_string(name_variant, NULL);
info->status = g_variant_dup_string(status_variant, NULL);
ObexSession *session = obex_session_new(g_variant_get_string(session_variant, NULL));
info->obex_root = g_strdup(obex_session_get_root(session, NULL));


g_variant_unref(size_variant);
g_variant_unref(name_variant);
g_variant_unref(status_variant);
g_variant_unref(session_variant);
g_object_unref(session);

g_hash_table_insert(_transfer_infos, g_strdup(interface_object_path), info);
if(g_strcmp0(info->status, "queued") == 0)
g_print("[Transfer#%s] Waiting...\n", info->filename);
Expand All @@ -233,6 +268,8 @@ static void _obex_opp_client_object_manager_handler(GDBusConnection *connection,
}

g_variant_unref(interfaces_and_properties);
g_variant_unref(interface_value);

if(properties)
g_variant_unref(properties);
}
Expand All @@ -248,10 +285,7 @@ static void _obex_opp_client_object_manager_handler(GDBusConnection *connection,
if(g_strcmp0(*inf, OBEX_TRANSFER_DBUS_INTERFACE) == 0)
{
// g_print("[OBEX Client] OBEX transfer closed\n");
ObexTransfer *transfer = g_hash_table_lookup(_transfers, interface_object_path);
g_hash_table_remove(_transfers, interface_object_path);
g_object_unref(transfer);
g_free(g_hash_table_lookup(_transfer_infos, interface_object_path));
g_hash_table_remove(_transfer_infos, interface_object_path);
if (g_main_loop_is_running(mainloop))
g_main_loop_quit(mainloop);
Expand Down Expand Up @@ -490,8 +524,8 @@ int main(int argc, char *argv[])
exit_if_error(error);
}

_transfers = g_hash_table_new(g_str_hash, g_str_equal);
_transfer_infos = g_hash_table_new(g_str_hash, g_str_equal);
_transfers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref);
_transfer_infos = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)obex_transfer_info_free);

ObexAgentManager *manager = obex_agent_manager_new();

Expand Down Expand Up @@ -528,21 +562,10 @@ int main(int argc, char *argv[])
g_hash_table_iter_init(&iter, _transfers);
while (g_hash_table_iter_next(&iter, &key, &value))
{
ObexTransfer *t = OBEX_TRANSFER(value);
obex_transfer_cancel(t, NULL); // skip errors
g_object_unref(t);
g_hash_table_iter_remove(&iter);
}
g_hash_table_unref(_transfers);

// Remove transfer information
g_hash_table_iter_init(&iter, _transfer_infos);
while (g_hash_table_iter_next(&iter, &key, &value))
{
g_free(value);
g_hash_table_iter_remove(&iter);
obex_transfer_cancel(OBEX_TRANSFER(value), NULL);
}
g_hash_table_unref(_transfers);
g_hash_table_unref(_transfer_infos);

g_dbus_connection_signal_unsubscribe(session_conn, obex_server_object_id);
g_dbus_connection_signal_unsubscribe(session_conn, obex_server_properties_id);
Expand All @@ -564,8 +587,8 @@ int main(int argc, char *argv[])
exit_if_error(error);
}

_transfers = g_hash_table_new(g_str_hash, g_str_equal);
_transfer_infos = g_hash_table_new(g_str_hash, g_str_equal);
_transfers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref);
_transfer_infos = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);

gchar * files_to_send[] = {NULL, NULL};
files_to_send[0] = g_path_is_absolute(opp_file_arg) ? g_strdup(opp_file_arg) : get_absolute_path(opp_file_arg);
Expand Down Expand Up @@ -603,7 +626,7 @@ int main(int argc, char *argv[])
mainloop = g_main_loop_new(NULL, FALSE);

ObexClient *client = obex_client_new();
const gchar *session_path = obex_client_create_session(client, dst_address, device_dict, &error);
const gchar *session_path = obex_client_create_session(client, dst_address, g_variant_ref(device_dict), &error);
exit_if_error(error);
ObexSession *session = obex_session_new(session_path);
ObexObjectPush *oop = obex_object_push_new(obex_session_get_dbus_object_path(session));
Expand Down Expand Up @@ -639,24 +662,13 @@ int main(int argc, char *argv[])
g_hash_table_iter_init(&iter, _transfers);
while (g_hash_table_iter_next(&iter, &key, &value))
{
ObexTransfer *t = OBEX_TRANSFER(value);
obex_transfer_cancel(t, NULL); // skip errors
g_object_unref(t);
g_hash_table_iter_remove(&iter);
}
g_hash_table_unref(_transfers);

// Remove transfer information objects
g_hash_table_iter_init(&iter, _transfer_infos);
while (g_hash_table_iter_next(&iter, &key, &value))
{
g_free(value);
g_hash_table_iter_remove(&iter);
obex_transfer_cancel(OBEX_TRANSFER(value), NULL);
}
g_hash_table_unref(_transfers);

g_object_unref(client);

g_hash_table_unref(_transfer_infos);
g_object_unref(client);
g_object_unref(session);
g_variant_unref(device_dict);

g_free(src_address);
Expand Down
60 changes: 24 additions & 36 deletions src/lib/helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,53 +159,41 @@ Adapter *find_adapter(const gchar *name, GError **error)

Manager *manager = g_object_new(MANAGER_TYPE, NULL);

// If name is null or empty - return default adapter
if (name == NULL || strlen(name) == 0)
// Try to find by id
adapter_path = (gchar *) manager_find_adapter(manager, name, error);

// Found
if (adapter_path)
{
adapter_path = (gchar *) manager_default_adapter(manager, error);
if (adapter_path)
{
// adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
adapter = adapter_new(adapter_path);
}
// adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
adapter = adapter_new(adapter_path);
}
else
{
// Try to find by id
adapter_path = (gchar *) manager_find_adapter(manager, name, error);

// Found
if (adapter_path)
// Try to find by name
GPtrArray *adapters_list = manager_get_adapters(manager);
g_assert(adapters_list != NULL);
for (int i = 0; i < adapters_list->len; i++)
{
adapter_path = g_ptr_array_index(adapters_list, i);
// adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
adapter = adapter_new(adapter_path);
}
else
{
// Try to find by name
const GPtrArray *adapters_list = manager_get_adapters(manager);
g_assert(adapters_list != NULL);
for (int i = 0; i < adapters_list->len; i++)
{
adapter_path = g_ptr_array_index(adapters_list, i);
// adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
adapter = adapter_new(adapter_path);
adapter_path = NULL;
adapter_path = NULL;

if (g_strcmp0(name, adapter_get_name(adapter, error)) == 0)
if (g_strcmp0(name, adapter_get_name(adapter, error)) == 0)
{
if (*error)
{
if (error)
{
g_error_free(*error);
*error = NULL;
}
break;
g_error_free(*error);
*error = NULL;
}

g_object_unref(adapter);
adapter = NULL;
break;
}

g_object_unref(adapter);
adapter = NULL;
}
g_ptr_array_unref(adapters_list);
}

g_object_unref(manager);
Expand Down Expand Up @@ -255,7 +243,7 @@ Device *find_device(Adapter *adapter, const gchar *name, GError **error)

if(g_variant_lookup(properties, "Address", "s", &address))
{
if(g_strcmp0(g_ascii_strdown(address, -1), g_ascii_strdown(name, -1)) == 0)
if(name && address && g_ascii_strcasecmp(address, name) == 0)
{
device = device_new(object_path);
}
Expand Down
Loading