diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2022-02-09 15:56:11 -0800 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2022-02-09 15:56:11 -0800 |
commit | c70b23d33b2952487543fdd580535a0ecf33bdcb (patch) | |
tree | 580941933c058e40a9be00b079ae0a8ba7c3a986 /src/adapter.c | |
parent | ec5209afeaada2484fc3ac865d2b4431e4a823f7 (diff) | |
download | bluez-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.c | 6 |
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, |