summaryrefslogtreecommitdiff
path: root/src/adapter.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2022-02-09 15:56:11 -0800
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2022-02-09 15:56:11 -0800
commitc70b23d33b2952487543fdd580535a0ecf33bdcb (patch)
tree580941933c058e40a9be00b079ae0a8ba7c3a986 /src/adapter.c
parentec5209afeaada2484fc3ac865d2b4431e4a823f7 (diff)
downloadbluez-c70b23d33b2952487543fdd580535a0ecf33bdcb.tar.gz
adapter: Fix crash when storing link key
The following trace can be observed sometimes when pairing 2 emulator instances: src/adapter.c:store_link_key() Unable to load key file from /var/lib/bluetooth/9C:DA:3E:F2:8E:46/9C:B6:D0:8A:A0:0C/info: (No such file or directory) GLib: g_file_set_contents: assertion 'error == NULL || *error == NULL' failed ++++++++ backtrace ++++++++ #1 btd_backtrace+0x28a (src/backtrace.c:59) [0x7f65bb5ab53a] #2 g_logv+0x21c (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.6400.6) [0x7f65ba3f955c] #3 g_log+0x93 (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.6400.6) [0x7f65ba3f9743] #4 g_file_set_contents+0x68 (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.6400.6) [0x7f65ba3dca68] #5 store_link_key+0x30a (src/adapter.c:8235) [0x7f65bb61839a] #6 new_link_key_callback+0x474 (src/adapter.c:8285) [0x7f65bb62c904] #7 queue_foreach+0x164 (src/shared/queue.c:203) [0x7f65bb722e34] #8 can_read_data+0x59f (src/shared/mgmt.c:343) [0x7f65bb72e09f] #9 watch_callback+0x112 (src/shared/io-glib.c:162) [0x7f65bb78acb2] #10 g_main_context_dispatch+0x14e (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.6400.6) [0x7f65ba3f204e]
Diffstat (limited to 'src/adapter.c')
-rw-r--r--src/adapter.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/adapter.c b/src/adapter.c
index a6dcc76de..3ee98431d 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -8214,11 +8214,15 @@ static void store_link_key(struct btd_adapter *adapter,
snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
btd_adapter_get_storage_dir(adapter), device_addr);
+ create_file(filename, 0600);
+
key_file = g_key_file_new();
if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
error("Unable to load key file from %s: (%s)", filename,
gerr->message);
g_error_free(gerr);
+ g_key_file_free(key_file);
+ return;
}
for (i = 0; i < 16; i++)
@@ -8229,8 +8233,6 @@ static void store_link_key(struct btd_adapter *adapter,
g_key_file_set_integer(key_file, "LinkKey", "Type", type);
g_key_file_set_integer(key_file, "LinkKey", "PINLength", pin_length);
- create_file(filename, 0600);
-
str = g_key_file_to_data(key_file, &length, NULL);
if (!g_file_set_contents(filename, str, length, &gerr)) {
error("Unable set contents for %s: (%s)", filename,