summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJörg Sommer <joerg.sommer@navimatix.de>2024-03-18 21:04:37 +0100
committerKhem Raj <raj.khem@gmail.com>2024-03-18 15:42:51 -0700
commit30a5a3bb26cf80f97b0f2cc232fe2fdcc663fd11 (patch)
treeab2cb1c9c4baae6eabe38d272944ccde4221f4b8
parenta0ae7874559121ea8a2ad2b559197423c3ff37ef (diff)
downloadmeta-openembedded-30a5a3bb26cf80f97b0f2cc232fe2fdcc663fd11.tar.gz
bluez-tools: New recipe for bluez5 tools
Signed-off-by: Khem Raj <raj.khem@gmail.com>
-rw-r--r--meta-networking/recipes-connectivity/bluez-tools/bluez-tools/fix-memory-leaks.patch768
-rw-r--r--meta-networking/recipes-connectivity/bluez-tools/bluez-tools/obex-file-fix-null-check.patch41
-rw-r--r--meta-networking/recipes-connectivity/bluez-tools/bluez-tools_git.bb24
3 files changed, 833 insertions, 0 deletions
diff --git a/meta-networking/recipes-connectivity/bluez-tools/bluez-tools/fix-memory-leaks.patch b/meta-networking/recipes-connectivity/bluez-tools/bluez-tools/fix-memory-leaks.patch
new file mode 100644
index 0000000000..22e1fac855
--- /dev/null
+++ b/meta-networking/recipes-connectivity/bluez-tools/bluez-tools/fix-memory-leaks.patch
@@ -0,0 +1,768 @@
1Upstream-Status: Submitted [https://github.com/khvzak/bluez-tools/pull/48]
2
3From e5db2eec2591f0109f0eb7c2631055210b55f2f5 Mon Sep 17 00:00:00 2001
4Message-Id: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
5From: thatlittlegit <personal@thatlittlegit.tk>
6Date: Sat, 7 Nov 2020 01:07:24 -0500
7Subject: [PATCH 1/9] Remove memory leaks and overall restructure
8 manager_find_adapter
9
10---
11 src/lib/manager.c | 61 +++++++++++++++++++++++++++++++++--------------
12 1 file changed, 43 insertions(+), 18 deletions(-)
13
14diff --git a/src/lib/manager.c b/src/lib/manager.c
15index 5286a3a..2263afc 100644
16--- a/src/lib/manager.c
17+++ b/src/lib/manager.c
18@@ -136,43 +136,68 @@ const gchar *manager_find_adapter(Manager *self, const gchar *pattern, GError **
19 GVariant *ifaces_and_properties;
20 GVariantIter i;
21
22+ gchar *pattern_lowercase = g_ascii_strdown(pattern, -1);
23+
24 g_variant_iter_init(&i, objects);
25- while (g_variant_iter_next(&i, "{&o@a{sa{sv}}}", &object_path, &ifaces_and_properties))
26+ gboolean still_looking = TRUE;
27+ while (still_looking && g_variant_iter_next(&i, "{&o@a{sa{sv}}}", &object_path, &ifaces_and_properties))
28 {
29 const gchar *interface_name;
30- GVariant *properties;
31 GVariantIter ii;
32+ GVariant* properties;
33 g_variant_iter_init(&ii, ifaces_and_properties);
34 while (g_variant_iter_next(&ii, "{&s@a{sv}}", &interface_name, &properties))
35 {
36- if (g_strstr_len(g_ascii_strdown(interface_name, -1), -1, "adapter"))
37+ gchar *interface_name_lowercase = g_ascii_strdown(interface_name, -1);
38+ if (strstr(interface_name_lowercase, "adapter"))
39 {
40- const gchar *object_base_name = g_path_get_basename(object_path);
41- if (g_strstr_len(g_ascii_strdown(object_base_name, -1), -1, g_ascii_strdown(pattern, -1)))
42+ g_free(interface_name_lowercase);
43+
44+ gchar *object_base_name_original = g_path_get_basename(object_path);
45+ gchar *object_base_name = g_ascii_strdown(interface_name, -1);
46+ g_free(object_base_name_original);
47+
48+ if (strstr(object_base_name, pattern_lowercase))
49 {
50- const gchar *retVal = g_strdup(object_path);
51- g_variant_unref(properties);
52- g_variant_unref(ifaces_and_properties);
53- g_variant_unref(objects);
54- return retVal;
55+ still_looking = FALSE;
56+ g_free(object_base_name);
57+ break;
58 }
59- const gchar *address = g_variant_get_string(g_variant_lookup_value(properties, "Address", NULL), NULL);
60- if (g_strstr_len(g_ascii_strdown(address, -1), -1, g_ascii_strdown(pattern, -1)))
61+
62+ g_free(object_base_name);
63+
64+ const gchar *address_original = g_variant_get_string(g_variant_lookup_value(properties, "Address", NULL), NULL);
65+ gchar *address = g_ascii_strdown(address_original, -1);
66+
67+ if (strstr(address, pattern_lowercase))
68 {
69- gchar *retVal = g_strdup(object_path);
70- g_variant_unref(properties);
71- g_variant_unref(ifaces_and_properties);
72- g_variant_unref(objects);
73- return retVal;
74+ still_looking = FALSE;
75+ g_free(address);
76+ break;
77 }
78+ g_free(address);
79 }
80+ else
81+ {
82+ g_free(interface_name_lowercase);
83+ }
84+
85 g_variant_unref(properties);
86 }
87+
88 g_variant_unref(ifaces_and_properties);
89 }
90 g_variant_unref(objects);
91+ g_free(pattern_lowercase);
92
93- return NULL;
94+ if (still_looking)
95+ {
96+ return NULL;
97+ }
98+ else
99+ {
100+ return object_path;
101+ }
102 }
103
104 GPtrArray *manager_get_adapters(Manager *self)
105--
1062.34.1
107
108
109From 163fcc94f1bc7c8f238e78adb03af914a566d979 Mon Sep 17 00:00:00 2001
110Message-Id: <163fcc94f1bc7c8f238e78adb03af914a566d979.1710791277.git.joerg.sommer@navimatix.de>
111In-Reply-To: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
112References: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
113From: thatlittlegit <personal@thatlittlegit.tk>
114Date: Sat, 7 Nov 2020 22:12:21 -0500
115Subject: [PATCH 2/9] Replace manager_default_adapter with
116 manager_find_adapter(..., NULL, ...)
117
118---
119 src/lib/helpers.c | 57 ++++++++++++++++++-----------------------------
120 src/lib/manager.c | 51 +++++++++---------------------------------
121 src/lib/manager.h | 1 -
122 3 files changed, 33 insertions(+), 76 deletions(-)
123
124diff --git a/src/lib/helpers.c b/src/lib/helpers.c
125index d7e95f9..99561b5 100644
126--- a/src/lib/helpers.c
127+++ b/src/lib/helpers.c
128@@ -159,52 +159,39 @@ Adapter *find_adapter(const gchar *name, GError **error)
129
130 Manager *manager = g_object_new(MANAGER_TYPE, NULL);
131
132- // If name is null or empty - return default adapter
133- if (name == NULL || strlen(name) == 0)
134+ // Try to find by id
135+ adapter_path = (gchar *) manager_find_adapter(manager, name, error);
136+
137+ // Found
138+ if (adapter_path)
139 {
140- adapter_path = (gchar *) manager_default_adapter(manager, error);
141- if (adapter_path)
142- {
143- // adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
144- adapter = adapter_new(adapter_path);
145- }
146+ // adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
147+ adapter = adapter_new(adapter_path);
148 }
149 else
150 {
151- // Try to find by id
152- adapter_path = (gchar *) manager_find_adapter(manager, name, error);
153-
154- // Found
155- if (adapter_path)
156+ // Try to find by name
157+ const GPtrArray *adapters_list = manager_get_adapters(manager);
158+ g_assert(adapters_list != NULL);
159+ for (int i = 0; i < adapters_list->len; i++)
160 {
161+ adapter_path = g_ptr_array_index(adapters_list, i);
162 // adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
163 adapter = adapter_new(adapter_path);
164- }
165- else
166- {
167- // Try to find by name
168- const GPtrArray *adapters_list = manager_get_adapters(manager);
169- g_assert(adapters_list != NULL);
170- for (int i = 0; i < adapters_list->len; i++)
171+ adapter_path = NULL;
172+
173+ if (g_strcmp0(name, adapter_get_name(adapter, error)) == 0)
174 {
175- adapter_path = g_ptr_array_index(adapters_list, i);
176- // adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
177- adapter = adapter_new(adapter_path);
178- adapter_path = NULL;
179-
180- if (g_strcmp0(name, adapter_get_name(adapter, error)) == 0)
181+ if (*error)
182 {
183- if (error)
184- {
185- g_error_free(*error);
186- *error = NULL;
187- }
188- break;
189+ g_error_free(*error);
190+ *error = NULL;
191 }
192-
193- g_object_unref(adapter);
194- adapter = NULL;
195+ break;
196 }
197+
198+ g_object_unref(adapter);
199+ adapter = NULL;
200 }
201 }
202
203diff --git a/src/lib/manager.c b/src/lib/manager.c
204index 2263afc..891fc45 100644
205--- a/src/lib/manager.c
206+++ b/src/lib/manager.c
207@@ -84,45 +84,6 @@ GVariant *manager_get_managed_objects(Manager *self, GError **error)
208 return retVal;
209 }
210
211-const gchar *manager_default_adapter(Manager *self, GError **error)
212-{
213- g_assert(MANAGER_IS(self));
214-
215- GVariant *objects = NULL;
216- objects = manager_get_managed_objects(self, error);
217- if (objects == NULL)
218- return NULL;
219-
220- const gchar *object_path;
221- GVariant *ifaces_and_properties;
222- GVariantIter i;
223-
224- g_variant_iter_init(&i, objects);
225- while (g_variant_iter_next(&i, "{&o@a{sa{sv}}}", &object_path, &ifaces_and_properties))
226- {
227- const gchar *interface_name;
228- GVariant *properties;
229- GVariantIter ii;
230- g_variant_iter_init(&ii, ifaces_and_properties);
231- while (g_variant_iter_next(&ii, "{&s@a{sv}}", &interface_name, &properties))
232- {
233- if (g_strstr_len(g_ascii_strdown(interface_name, -1), -1, "adapter"))
234- {
235- const gchar *retVal = g_strdup(object_path);
236- g_variant_unref(properties);
237- g_variant_unref(ifaces_and_properties);
238- g_variant_unref(objects);
239- return retVal;
240- }
241- g_variant_unref(properties);
242- }
243- g_variant_unref(ifaces_and_properties);
244- }
245- g_variant_unref(objects);
246-
247- return NULL;
248-}
249-
250 const gchar *manager_find_adapter(Manager *self, const gchar *pattern, GError **error)
251 {
252 g_assert(MANAGER_IS(self));
253@@ -136,7 +97,11 @@ const gchar *manager_find_adapter(Manager *self, const gchar *pattern, GError **
254 GVariant *ifaces_and_properties;
255 GVariantIter i;
256
257- gchar *pattern_lowercase = g_ascii_strdown(pattern, -1);
258+ gchar *pattern_lowercase = NULL;
259+ if (pattern != NULL)
260+ {
261+ pattern_lowercase = g_ascii_strdown(pattern, -1);
262+ }
263
264 g_variant_iter_init(&i, objects);
265 gboolean still_looking = TRUE;
266@@ -153,6 +118,12 @@ const gchar *manager_find_adapter(Manager *self, const gchar *pattern, GError **
267 {
268 g_free(interface_name_lowercase);
269
270+ if (!pattern_lowercase)
271+ {
272+ still_looking = FALSE;
273+ break;
274+ }
275+
276 gchar *object_base_name_original = g_path_get_basename(object_path);
277 gchar *object_base_name = g_ascii_strdown(interface_name, -1);
278 g_free(object_base_name_original);
279diff --git a/src/lib/manager.h b/src/lib/manager.h
280index 0c9e052..b651812 100644
281--- a/src/lib/manager.h
282+++ b/src/lib/manager.h
283@@ -54,7 +54,6 @@ extern "C" {
284 * Method definitions.
285 */
286 GVariant *manager_get_managed_objects(Manager *self, GError **error);
287- const gchar *manager_default_adapter(Manager *self, GError **error);
288 const gchar *manager_find_adapter(Manager *self, const gchar *pattern, GError **error);
289 GPtrArray *manager_get_adapters(Manager *self);
290 const gchar **manager_get_devices(Manager *self, const gchar *adapter_pattern);
291--
2922.34.1
293
294
295From b463d9cfc2390ca6352c16e6f6e113cf42d0f688 Mon Sep 17 00:00:00 2001
296Message-Id: <b463d9cfc2390ca6352c16e6f6e113cf42d0f688.1710791277.git.joerg.sommer@navimatix.de>
297In-Reply-To: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
298References: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
299From: thatlittlegit <personal@thatlittlegit.tk>
300Date: Sat, 7 Nov 2020 23:38:42 -0500
301Subject: [PATCH 3/9] Fix remaining g_ascii_strdown leaks
302
303---
304 src/lib/helpers.c | 2 +-
305 src/lib/manager.c | 5 ++++-
306 src/lib/properties.c | 4 ++--
307 3 files changed, 7 insertions(+), 4 deletions(-)
308
309diff --git a/src/lib/helpers.c b/src/lib/helpers.c
310index 99561b5..b61bc07 100644
311--- a/src/lib/helpers.c
312+++ b/src/lib/helpers.c
313@@ -242,7 +242,7 @@ Device *find_device(Adapter *adapter, const gchar *name, GError **error)
314
315 if(g_variant_lookup(properties, "Address", "s", &address))
316 {
317- if(g_strcmp0(g_ascii_strdown(address, -1), g_ascii_strdown(name, -1)) == 0)
318+ if(name && address && g_ascii_strcasecmp(address, name) == 0)
319 {
320 device = device_new(object_path);
321 }
322diff --git a/src/lib/manager.c b/src/lib/manager.c
323index 891fc45..d506ae6 100644
324--- a/src/lib/manager.c
325+++ b/src/lib/manager.c
326@@ -200,8 +200,11 @@ GPtrArray *manager_get_adapters(Manager *self)
327 g_variant_iter_init(&ii, ifaces_and_properties);
328 while (g_variant_iter_next(&ii, "{&s@a{sv}}", &interface_name, &properties))
329 {
330- if (g_strstr_len(g_ascii_strdown(interface_name, -1), -1, "adapter"))
331+ char* interface_name_lowercase = g_ascii_strdown(interface_name, -1);
332+ if (strstr(interface_name_lowercase, "adapter"))
333 g_ptr_array_add(adapter_array, (gpointer) g_strdup(object_path));
334+
335+ g_free(interface_name_lowercase);
336 g_variant_unref(properties);
337 }
338 g_variant_unref(ifaces_and_properties);
339diff --git a/src/lib/properties.c b/src/lib/properties.c
340index 8b913d5..70a7640 100644
341--- a/src/lib/properties.c
342+++ b/src/lib/properties.c
343@@ -205,12 +205,12 @@ static void _properties_create_gdbus_proxy(Properties *self, GError **error)
344 {
345 if(self->priv->dbus_type && self->priv->dbus_service_name && self->priv->dbus_object_path)
346 {
347- if(g_ascii_strcasecmp(g_ascii_strdown(self->priv->dbus_type, -1), "system") == 0)
348+ if(g_ascii_strcasecmp(self->priv->dbus_type, "system") == 0)
349 {
350 g_assert(system_conn != NULL);
351 self->priv->proxy = g_dbus_proxy_new_sync(system_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, self->priv->dbus_service_name, self->priv->dbus_object_path, PROPERTIES_DBUS_INTERFACE, NULL, error);
352 }
353- else if(g_ascii_strcasecmp(g_ascii_strdown(self->priv->dbus_type, -1), "session") == 0)
354+ else if(g_ascii_strcasecmp(self->priv->dbus_type, "session") == 0)
355 {
356 g_assert(session_conn != NULL);
357 self->priv->proxy = g_dbus_proxy_new_sync(session_conn, G_DBUS_PROXY_FLAGS_NONE, NULL, self->priv->dbus_service_name, self->priv->dbus_object_path, PROPERTIES_DBUS_INTERFACE, NULL, error);
358--
3592.34.1
360
361
362From 7ca191164a3a3d8867b1a4af7cd349dc53569fa3 Mon Sep 17 00:00:00 2001
363Message-Id: <7ca191164a3a3d8867b1a4af7cd349dc53569fa3.1710791277.git.joerg.sommer@navimatix.de>
364In-Reply-To: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
365References: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
366From: thatlittlegit <personal@thatlittlegit.tk>
367Date: Sun, 8 Nov 2020 14:04:36 -0500
368Subject: [PATCH 4/9] Don't leak g_variant_lookup_value results in bt-obex
369
370---
371 src/bt-obex.c | 23 ++++++++++++++++-------
372 1 file changed, 16 insertions(+), 7 deletions(-)
373
374diff --git a/src/bt-obex.c b/src/bt-obex.c
375index 8aacb40..0f044a5 100644
376--- a/src/bt-obex.c
377+++ b/src/bt-obex.c
378@@ -213,15 +213,24 @@ static void _obex_opp_client_object_manager_handler(GDBusConnection *connection,
379 g_hash_table_insert(_transfers, g_strdup(interface_object_path), t);
380
381 ObexTransferInfo *info = g_malloc0(sizeof(ObexTransferInfo));
382- info->filesize = g_variant_get_uint64(g_variant_lookup_value(properties, "Size", NULL));
383- info->filename = g_strdup(g_variant_get_string(g_variant_lookup_value(properties, "Name", NULL), NULL));
384- info->status = g_strdup(g_variant_get_string(g_variant_lookup_value(properties, "Status", NULL), NULL));
385- ObexSession *session = obex_session_new(g_variant_get_string(g_variant_lookup_value(properties, "Session", NULL), NULL));
386-
387+
388+ GVariant* size_variant = g_variant_lookup_value(properties, "Size", NULL);
389+ GVariant* name_variant = g_variant_lookup_value(properties, "Name", NULL);
390+ GVariant* status_variant = g_variant_lookup_value(properties, "Status", NULL);
391+ GVariant* session_variant = g_variant_lookup_value(properties, "Session", NULL);
392+
393+ info->filesize = g_variant_get_uint64(size_variant);
394+ info->filename = g_variant_dup_string(name_variant, NULL);
395+ info->status = g_variant_dup_string(status_variant, NULL);
396+ ObexSession *session = obex_session_new(g_variant_get_string(session_variant, NULL));
397 info->obex_root = g_strdup(obex_session_get_root(session, NULL));
398-
399+
400+ g_variant_unref(size_variant);
401+ g_variant_unref(name_variant);
402+ g_variant_unref(status_variant);
403+ g_variant_unref(session_variant);
404 g_object_unref(session);
405-
406+
407 g_hash_table_insert(_transfer_infos, g_strdup(interface_object_path), info);
408 if(g_strcmp0(info->status, "queued") == 0)
409 g_print("[Transfer#%s] Waiting...\n", info->filename);
410--
4112.34.1
412
413
414From 7100380b710b36f8e31748ac5bf0e6ffb7c4eed7 Mon Sep 17 00:00:00 2001
415Message-Id: <7100380b710b36f8e31748ac5bf0e6ffb7c4eed7.1710791277.git.joerg.sommer@navimatix.de>
416In-Reply-To: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
417References: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
418From: thatlittlegit <personal@thatlittlegit.tk>
419Date: Thu, 12 Nov 2020 21:41:55 -0500
420Subject: [PATCH 5/9] Correctly free temporary values in bt-obex
421
422---
423 src/bt-obex.c | 35 +++++++++++++++++++++++++----------
424 src/lib/helpers.c | 3 ++-
425 2 files changed, 27 insertions(+), 11 deletions(-)
426
427diff --git a/src/bt-obex.c b/src/bt-obex.c
428index 0f044a5..547186b 100644
429--- a/src/bt-obex.c
430+++ b/src/bt-obex.c
431@@ -70,25 +70,32 @@ static void _obex_server_object_manager_handler(GDBusConnection *connection, con
432 const gchar *interface_object_path = g_variant_get_string(g_variant_get_child_value(parameters, 0), NULL);
433 GVariant *interfaces_and_properties = g_variant_get_child_value(parameters, 1);
434 GVariant *properties = NULL;
435-
436+
437 if(g_variant_lookup(interfaces_and_properties, OBEX_TRANSFER_DBUS_INTERFACE, "@a{sv}", &properties))
438 {
439 g_print("[OBEX Server] Transfer started\n");
440 ObexTransfer *t = obex_transfer_new(interface_object_path);
441 g_hash_table_insert(_transfers, g_strdup(interface_object_path), t);
442-
443+
444+ GVariant* size_variant = g_variant_lookup_value(properties, "Size", NULL);
445+ GVariant* status_variant = g_variant_lookup_value(properties, "Status", NULL);
446+ GVariant* session_variant = g_variant_lookup_value(properties, "Session", NULL);
447+
448 ObexTransferInfo *info = g_malloc0(sizeof(ObexTransferInfo));
449- info->filesize = g_variant_get_uint64(g_variant_lookup_value(properties, "Size", NULL));
450- info->status = g_strdup(g_variant_get_string(g_variant_lookup_value(properties, "Status", NULL), NULL));
451- ObexSession *session = obex_session_new(g_variant_get_string(g_variant_lookup_value(properties, "Session", NULL), NULL));
452-
453+ info->filesize = g_variant_get_uint64(size_variant);
454+ info->status = g_strdup(g_variant_get_string(status_variant, NULL));
455+
456+ ObexSession *session = obex_session_new(g_variant_get_string(session_variant, NULL));
457 info->obex_root = g_strdup(obex_session_get_root(session, NULL));
458-
459 g_object_unref(session);
460+
461+ g_variant_unref(size_variant);
462+ g_variant_unref(status_variant);
463+ g_variant_unref(session_variant);
464
465 g_hash_table_insert(_transfer_infos, g_strdup(interface_object_path), info);
466 }
467-
468+
469 if(g_variant_lookup(interfaces_and_properties, OBEX_SESSION_DBUS_INTERFACE, "@a{sv}", &properties))
470 {
471 g_print("[OBEX Server] OBEX session opened\n");
472@@ -177,7 +184,12 @@ static void _obex_server_properties_handler(GDBusConnection *connection, const g
473 {
474 g_print("[OBEX Server] Transfer succeeded\n");
475 ObexTransferInfo *info = g_hash_table_lookup(_transfer_infos, object_path);
476- g_rename(g_build_filename(info->obex_root, info->filename, NULL), g_build_filename(_root_path, info->filename, NULL));
477+
478+ gchar* old_name = g_build_filename(info->obex_root, info->filename, NULL);
479+ gchar* new_name = g_build_filename(_root_path, info->filename, NULL);
480+ g_rename(old_name, new_name);
481+ g_free(old_name);
482+ g_free(new_name);
483 }
484 else if(g_strcmp0(status, "error") == 0)
485 {
486@@ -202,7 +214,8 @@ static void _obex_opp_client_object_manager_handler(GDBusConnection *connection,
487 {
488 if(g_strcmp0(signal_name, "InterfacesAdded") == 0)
489 {
490- const gchar *interface_object_path = g_variant_get_string(g_variant_get_child_value(parameters, 0), NULL);
491+ GVariant* interface_value = g_variant_get_child_value(parameters, 0);
492+ const gchar *interface_object_path = g_variant_get_string(interface_value, NULL);
493 GVariant *interfaces_and_properties = g_variant_get_child_value(parameters, 1);
494 GVariant *properties = NULL;
495
496@@ -242,6 +255,8 @@ static void _obex_opp_client_object_manager_handler(GDBusConnection *connection,
497 }
498
499 g_variant_unref(interfaces_and_properties);
500+ g_variant_unref(interface_value);
501+
502 if(properties)
503 g_variant_unref(properties);
504 }
505diff --git a/src/lib/helpers.c b/src/lib/helpers.c
506index b61bc07..d9e2257 100644
507--- a/src/lib/helpers.c
508+++ b/src/lib/helpers.c
509@@ -171,7 +171,7 @@ Adapter *find_adapter(const gchar *name, GError **error)
510 else
511 {
512 // Try to find by name
513- const GPtrArray *adapters_list = manager_get_adapters(manager);
514+ GPtrArray *adapters_list = manager_get_adapters(manager);
515 g_assert(adapters_list != NULL);
516 for (int i = 0; i < adapters_list->len; i++)
517 {
518@@ -193,6 +193,7 @@ Adapter *find_adapter(const gchar *name, GError **error)
519 g_object_unref(adapter);
520 adapter = NULL;
521 }
522+ g_ptr_array_unref(adapters_list);
523 }
524
525 g_object_unref(manager);
526--
5272.34.1
528
529
530From 860fb6e19a7bc272722c36a980004044bc9906e5 Mon Sep 17 00:00:00 2001
531Message-Id: <860fb6e19a7bc272722c36a980004044bc9906e5.1710791277.git.joerg.sommer@navimatix.de>
532In-Reply-To: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
533References: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
534From: thatlittlegit <personal@thatlittlegit.tk>
535Date: Thu, 12 Nov 2020 21:45:51 -0500
536Subject: [PATCH 6/9] Use g_hash_table_new_full() instead of manual freeing
537
538---
539 src/bt-obex.c | 56 +++++++++++++++++----------------------------------
540 1 file changed, 18 insertions(+), 38 deletions(-)
541
542diff --git a/src/bt-obex.c b/src/bt-obex.c
543index 547186b..413c12d 100644
544--- a/src/bt-obex.c
545+++ b/src/bt-obex.c
546@@ -55,6 +55,14 @@ struct _ObexTransferInfo {
547 gchar *status;
548 };
549
550+static void obex_transfer_info_free(ObexTransferInfo* info)
551+{
552+ g_free(info->filename);
553+ g_free(info->obex_root);
554+ g_free(info->status);
555+ g_free(info);
556+}
557+
558 static void sigterm_handler(int sig)
559 {
560 g_message("%s received", sig == SIGTERM ? "SIGTERM" : "SIGINT");
561@@ -117,10 +125,7 @@ static void _obex_server_object_manager_handler(GDBusConnection *connection, con
562 if(g_strcmp0(*inf, OBEX_TRANSFER_DBUS_INTERFACE) == 0)
563 {
564 g_print("[OBEX Server] OBEX transfer closed\n");
565- ObexTransfer *transfer = g_hash_table_lookup(_transfers, interface_object_path);
566 g_hash_table_remove(_transfers, interface_object_path);
567- g_object_unref(transfer);
568- g_free(g_hash_table_lookup(_transfer_infos, interface_object_path));
569 g_hash_table_remove(_transfer_infos, interface_object_path);
570 }
571
572@@ -272,10 +277,7 @@ static void _obex_opp_client_object_manager_handler(GDBusConnection *connection,
573 if(g_strcmp0(*inf, OBEX_TRANSFER_DBUS_INTERFACE) == 0)
574 {
575 // g_print("[OBEX Client] OBEX transfer closed\n");
576- ObexTransfer *transfer = g_hash_table_lookup(_transfers, interface_object_path);
577 g_hash_table_remove(_transfers, interface_object_path);
578- g_object_unref(transfer);
579- g_free(g_hash_table_lookup(_transfer_infos, interface_object_path));
580 g_hash_table_remove(_transfer_infos, interface_object_path);
581 if (g_main_loop_is_running(mainloop))
582 g_main_loop_quit(mainloop);
583@@ -514,8 +516,8 @@ int main(int argc, char *argv[])
584 exit_if_error(error);
585 }
586
587- _transfers = g_hash_table_new(g_str_hash, g_str_equal);
588- _transfer_infos = g_hash_table_new(g_str_hash, g_str_equal);
589+ _transfers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref);
590+ _transfer_infos = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)obex_transfer_info_free);
591
592 ObexAgentManager *manager = obex_agent_manager_new();
593
594@@ -552,21 +554,10 @@ int main(int argc, char *argv[])
595 g_hash_table_iter_init(&iter, _transfers);
596 while (g_hash_table_iter_next(&iter, &key, &value))
597 {
598- ObexTransfer *t = OBEX_TRANSFER(value);
599- obex_transfer_cancel(t, NULL); // skip errors
600- g_object_unref(t);
601- g_hash_table_iter_remove(&iter);
602- }
603- g_hash_table_unref(_transfers);
604-
605- // Remove transfer information
606- g_hash_table_iter_init(&iter, _transfer_infos);
607- while (g_hash_table_iter_next(&iter, &key, &value))
608- {
609- g_free(value);
610- g_hash_table_iter_remove(&iter);
611+ obex_transfer_cancel(OBEX_TRANSFER(value), NULL);
612 }
613 g_hash_table_unref(_transfers);
614+ g_hash_table_unref(_transfer_infos);
615
616 g_dbus_connection_signal_unsubscribe(session_conn, obex_server_object_id);
617 g_dbus_connection_signal_unsubscribe(session_conn, obex_server_properties_id);
618@@ -588,8 +579,8 @@ int main(int argc, char *argv[])
619 exit_if_error(error);
620 }
621
622- _transfers = g_hash_table_new(g_str_hash, g_str_equal);
623- _transfer_infos = g_hash_table_new(g_str_hash, g_str_equal);
624+ _transfers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref);
625+ _transfer_infos = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
626
627 gchar * files_to_send[] = {NULL, NULL};
628 files_to_send[0] = g_path_is_absolute(opp_file_arg) ? g_strdup(opp_file_arg) : get_absolute_path(opp_file_arg);
629@@ -663,24 +654,13 @@ int main(int argc, char *argv[])
630 g_hash_table_iter_init(&iter, _transfers);
631 while (g_hash_table_iter_next(&iter, &key, &value))
632 {
633- ObexTransfer *t = OBEX_TRANSFER(value);
634- obex_transfer_cancel(t, NULL); // skip errors
635- g_object_unref(t);
636- g_hash_table_iter_remove(&iter);
637+ obex_transfer_cancel(OBEX_TRANSFER(value), NULL);
638 }
639 g_hash_table_unref(_transfers);
640-
641- // Remove transfer information objects
642- g_hash_table_iter_init(&iter, _transfer_infos);
643- while (g_hash_table_iter_next(&iter, &key, &value))
644- {
645- g_free(value);
646- g_hash_table_iter_remove(&iter);
647- }
648- g_hash_table_unref(_transfers);
649-
650- g_object_unref(client);
651
652+ g_hash_table_unref(_transfer_infos);
653+ g_object_unref(client);
654+ g_object_unref(session);
655 g_variant_unref(device_dict);
656
657 g_free(src_address);
658--
6592.34.1
660
661
662From 9804eb7e5996c52cc542eef59ba3b5f4d0b0b2f9 Mon Sep 17 00:00:00 2001
663Message-Id: <9804eb7e5996c52cc542eef59ba3b5f4d0b0b2f9.1710791277.git.joerg.sommer@navimatix.de>
664In-Reply-To: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
665References: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
666From: thatlittlegit <personal@thatlittlegit.tk>
667Date: Thu, 12 Nov 2020 21:51:34 -0500
668Subject: [PATCH 7/9] Don't set filesize if we don't know the size
669
670I only meant to fix the g_variant_unref warning, but fixing all of them
671works too!
672---
673 src/bt-obex.c | 12 ++++++++++--
674 1 file changed, 10 insertions(+), 2 deletions(-)
675
676diff --git a/src/bt-obex.c b/src/bt-obex.c
677index 413c12d..219d458 100644
678--- a/src/bt-obex.c
679+++ b/src/bt-obex.c
680@@ -90,14 +90,22 @@ static void _obex_server_object_manager_handler(GDBusConnection *connection, con
681 GVariant* session_variant = g_variant_lookup_value(properties, "Session", NULL);
682
683 ObexTransferInfo *info = g_malloc0(sizeof(ObexTransferInfo));
684- info->filesize = g_variant_get_uint64(size_variant);
685 info->status = g_strdup(g_variant_get_string(status_variant, NULL));
686
687 ObexSession *session = obex_session_new(g_variant_get_string(session_variant, NULL));
688 info->obex_root = g_strdup(obex_session_get_root(session, NULL));
689 g_object_unref(session);
690
691- g_variant_unref(size_variant);
692+ if (size_variant != NULL)
693+ {
694+ info->filesize = g_variant_get_uint64(size_variant);
695+ g_variant_unref(size_variant);
696+ }
697+ else
698+ {
699+ info->filesize = 0;
700+ }
701+
702 g_variant_unref(status_variant);
703 g_variant_unref(session_variant);
704
705--
7062.34.1
707
708
709From 9566f84464d486983ec597945bc4d5d1594ed830 Mon Sep 17 00:00:00 2001
710Message-Id: <9566f84464d486983ec597945bc4d5d1594ed830.1710791277.git.joerg.sommer@navimatix.de>
711In-Reply-To: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
712References: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
713From: thatlittlegit <personal@thatlittlegit.tk>
714Date: Sun, 15 Nov 2020 16:18:36 -0500
715Subject: [PATCH 8/9] Fix a use-after-free in bt-obex
716
717---
718 src/bt-obex.c | 2 +-
719 1 file changed, 1 insertion(+), 1 deletion(-)
720
721diff --git a/src/bt-obex.c b/src/bt-obex.c
722index 219d458..7dc5d6b 100644
723--- a/src/bt-obex.c
724+++ b/src/bt-obex.c
725@@ -626,7 +626,7 @@ int main(int argc, char *argv[])
726 mainloop = g_main_loop_new(NULL, FALSE);
727
728 ObexClient *client = obex_client_new();
729- const gchar *session_path = obex_client_create_session(client, dst_address, device_dict, &error);
730+ const gchar *session_path = obex_client_create_session(client, dst_address, g_variant_ref(device_dict), &error);
731 exit_if_error(error);
732 ObexSession *session = obex_session_new(session_path);
733 ObexObjectPush *oop = obex_object_push_new(obex_session_get_dbus_object_path(session));
734--
7352.34.1
736
737
738From 5271a4c6419b54a0b18070d39bfc69fae2819c00 Mon Sep 17 00:00:00 2001
739Message-Id: <5271a4c6419b54a0b18070d39bfc69fae2819c00.1710791277.git.joerg.sommer@navimatix.de>
740In-Reply-To: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
741References: <e5db2eec2591f0109f0eb7c2631055210b55f2f5.1710791277.git.joerg.sommer@navimatix.de>
742From: thatlittlegit <personal@thatlittlegit.tk>
743Date: Sat, 21 Nov 2020 13:09:46 -0500
744Subject: [PATCH 9/9] Fix running sdptool if it isn't in $PATH
745
746---
747 src/bt-device.c | 4 ++--
748 1 file changed, 2 insertions(+), 2 deletions(-)
749
750diff --git a/src/bt-device.c b/src/bt-device.c
751index a739b98..948a10c 100644
752--- a/src/bt-device.c
753+++ b/src/bt-device.c
754@@ -331,9 +331,9 @@ static GHashTable *_bt_device_sdp_browse(const gchar *device_path, const gchar *
755 }
756
757 if(pattern == NULL || strlen(pattern) == 0)
758- execl("/bin/sdptool", "/bin/sdptool", "browse", "--xml", device_path, (char *) 0);
759+ execlp("sdptool", "sdptool", "browse", "--xml", device_path, (char *) 0);
760 else
761- execl("/bin/sdptool", "/bin/sdptool", "browse", "--xml", "--uuid", pattern, device_path, (char *) 0);
762+ execlp("sdptool", "sdptool", "browse", "--xml", "--uuid", pattern, device_path, (char *) 0);
763
764 }
765 if(pid == -1)
766--
7672.34.1
768
diff --git a/meta-networking/recipes-connectivity/bluez-tools/bluez-tools/obex-file-fix-null-check.patch b/meta-networking/recipes-connectivity/bluez-tools/bluez-tools/obex-file-fix-null-check.patch
new file mode 100644
index 0000000000..231f3b0b71
--- /dev/null
+++ b/meta-networking/recipes-connectivity/bluez-tools/bluez-tools/obex-file-fix-null-check.patch
@@ -0,0 +1,41 @@
1Upstream-Status: Submitted [https://github.com/khvzak/bluez-tools/pull/47]
2
3From f9bc83d46f131037f7fa5195a506b65560199d0d Mon Sep 17 00:00:00 2001
4Message-Id: <f9bc83d46f131037f7fa5195a506b65560199d0d.1710791715.git.joerg.sommer@navimatix.de>
5From: George Talusan <george.talusan@gmail.com>
6Date: Mon, 26 Oct 2020 21:35:51 -0400
7Subject: [PATCH] fix null checks
8
9---
10 src/lib/bluez/obex/obex_file_transfer.c | 6 +++---
11 1 file changed, 3 insertions(+), 3 deletions(-)
12
13diff --git a/src/lib/bluez/obex/obex_file_transfer.c b/src/lib/bluez/obex/obex_file_transfer.c
14index 2d3dafe..91c41d6 100644
15--- a/src/lib/bluez/obex/obex_file_transfer.c
16+++ b/src/lib/bluez/obex/obex_file_transfer.c
17@@ -194,7 +194,7 @@ GVariant *obex_file_transfer_get_file(ObexFileTransfer *self, const gchar *targe
18 g_assert(OBEX_FILE_TRANSFER_IS(self));
19 GVariant *ret = NULL;
20 GVariant *proxy_ret = g_dbus_proxy_call_sync(self->priv->proxy, "GetFile", g_variant_new ("(ss)", targetfile, sourcefile), G_DBUS_CALL_FLAGS_NONE, -1, NULL, error);
21- if (proxy_ret != NULL)
22+ if (proxy_ret == NULL)
23 return NULL;
24 ret = g_variant_ref_sink(proxy_ret);
25 g_variant_unref(proxy_ret);
26@@ -228,9 +228,9 @@ GVariant *obex_file_transfer_put_file(ObexFileTransfer *self, const gchar *sourc
27 g_assert(OBEX_FILE_TRANSFER_IS(self));
28 GVariant *ret = NULL;
29 GVariant *proxy_ret = g_dbus_proxy_call_sync(self->priv->proxy, "PutFile", g_variant_new ("(ss)", targetfile, sourcefile), G_DBUS_CALL_FLAGS_NONE, -1, NULL, error);
30- if (proxy_ret != NULL)
31+ if (proxy_ret == NULL)
32 return NULL;
33 ret = g_variant_ref_sink(proxy_ret);
34 g_variant_unref(proxy_ret);
35 return ret;
36-}
37\ No newline at end of file
38+}
39--
402.34.1
41
diff --git a/meta-networking/recipes-connectivity/bluez-tools/bluez-tools_git.bb b/meta-networking/recipes-connectivity/bluez-tools/bluez-tools_git.bb
new file mode 100644
index 0000000000..22005632c2
--- /dev/null
+++ b/meta-networking/recipes-connectivity/bluez-tools/bluez-tools_git.bb
@@ -0,0 +1,24 @@
1SUMMARY = "Bluez Tools"
2DESCRIPTION = "\
3 Additional tools for bluez5 to list, manage, and show inforations about \
4 adapters, agents, devices, network connections, and obex. \
5"
6HOMEPAGE = "https://github.com/khvzak/bluez-tools"
7BUGTRACKER = "https://github.com/khvzak/bluez-tools/issues"
8LICENSE = "GPL-2.0-only"
9LIC_FILES_CHKSUM = "file://COPYING;md5=12f884d2ae1ff87c09e5b7ccc2c4ca7e"
10
11DEPENDS = "dbus-glib glib-2.0 readline"
12
13SRC_URI = "\
14 git://github.com/khvzak/bluez-tools.git;protocol=https;branch=master \
15 file://fix-memory-leaks.patch \
16 file://obex-file-fix-null-check.patch \
17"
18SRCREV = "f65321736475429316f07ee94ec0deac8e46ec4a"
19
20S = "${WORKDIR}/git"
21
22inherit autotools pkgconfig
23
24RDEPENDS:${PN} = "bluez5"