Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package bluez for openSUSE:Factory checked 
in at 2024-01-04 15:55:46
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/bluez (Old)
 and      /work/SRC/openSUSE:Factory/.bluez.new.28375 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "bluez"

Thu Jan  4 15:55:46 2024 rev:203 rq:1136648 version:5.71

Changes:
--------
--- /work/SRC/openSUSE:Factory/bluez/bluez.changes      2023-12-28 
22:55:26.401233898 +0100
+++ /work/SRC/openSUSE:Factory/.bluez.new.28375/bluez.changes   2024-01-04 
15:56:59.155616811 +0100
@@ -1,0 +2,7 @@
+Wed Jan  3 17:35:25 UTC 2024 - Dirk Müller <dmuel...@suse.com>
+
+- add fix-link-key-address-type.patch - thanks to
+  pallaswept for identifying the right patch for the pairing
+  regression
+
+-------------------------------------------------------------------

New:
----
  fix-link-key-address-type.patch

BETA DEBUG BEGIN:
  New:
- add fix-link-key-address-type.patch - thanks to
  pallaswept for identifying the right patch for the pairing
BETA DEBUG END:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ bluez.spec ++++++
--- /var/tmp/diff_new_pack.fk3QfW/_old  2024-01-04 15:56:59.919644722 +0100
+++ /var/tmp/diff_new_pack.fk3QfW/_new  2024-01-04 15:56:59.923644868 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package bluez
 #
-# Copyright (c) 2023 SUSE LLC
+# Copyright (c) 2024 SUSE LLC
 # Copyright (c) 2010-2020 B1 Systems GmbH, Vohburg, Germany
 #
 # All modifications and additions to the file contributed by third parties
@@ -54,6 +54,8 @@
 Patch3:         bluez-cups-libexec.patch
 # workaround for broken tests (reported upstream but not yet fixed)
 Patch4:         bluez-disable-broken-tests.diff
+# PATCH-FIX-UPSTREAM: taken from 
https://github.com/bluez/bluez/commit/7ad5669402c9acff8e4cc808edc12a41df36654e 
-- Fix for broken pairing in 5.71
+Patch5:         fix-link-key-address-type.patch
 # disable tests for bypass boo#1078285
 Patch12:        disable_some_obex_tests.patch
 # get rid of python2. WARNING: this is autogenerated by 2to3 and might not work

++++++ fix-link-key-address-type.patch ++++++
>From 7ad5669402c9acff8e4cc808edc12a41df36654e Mon Sep 17 00:00:00 2001
From: Luiz Augusto von Dentz <luiz.von.de...@intel.com>
Date: Wed, 20 Dec 2023 12:20:03 -0500
Subject: [PATCH] adapter: Fix link key address type for old kernels

On old kernels only BDADDR_BREDR is supported so this attempts to detect
that and retry.

Fixes: https://github.com/bluez/bluez/issues/686
---
 src/adapter.c | 59 ++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 44 insertions(+), 15 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index ee70b00d2..022390f0d 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -311,6 +311,7 @@ struct btd_adapter {
        bool pincode_requested;         /* PIN requested during last bonding */
        GSList *connections;            /* Connected devices */
        GSList *devices;                /* Devices structure pointers */
+       GSList *load_keys;              /* Devices keys to be loaded */
        GSList *connect_list;           /* Devices to connect when found */
        struct btd_device *connect_le;  /* LE device waiting to be connected */
        sdp_list_t *services;           /* Services associated to adapter */
@@ -4284,6 +4285,9 @@ static int set_privacy(struct btd_adapter *adapter, 
uint8_t privacy)
        return -1;
 }
 
+static void load_link_keys(struct btd_adapter *adapter, bool debug_keys,
+                                                       bool retry);
+
 static void load_link_keys_complete(uint8_t status, uint16_t length,
                                        const void *param, void *user_data)
 {
@@ -4293,18 +4297,31 @@ static void load_link_keys_complete(uint8_t status, 
uint16_t length,
                btd_error(adapter->dev_id,
                        "Failed to load link keys for hci%u: %s (0x%02x)",
                                adapter->dev_id, mgmt_errstr(status), status);
+
+               if (status == MGMT_STATUS_INVALID_PARAMS) {
+                       load_link_keys(adapter, btd_opts.debug_keys, true);
+                       /* Release keys after retry since we shall only retry
+                        * once.
+                        */
+                       goto done;
+               }
+
                return;
        }
 
        DBG("link keys loaded for hci%u", adapter->dev_id);
+
+done:
+       g_slist_free_full(adapter->load_keys, g_free);
+       adapter->load_keys = NULL;
 }
 
-static void load_link_keys(struct btd_adapter *adapter, GSList *keys,
-                                                       bool debug_keys)
+static void load_link_keys(struct btd_adapter *adapter, bool debug_keys,
+                                                       bool retry)
 {
        struct mgmt_cp_load_link_keys *cp;
        struct mgmt_link_key_info *key;
-       size_t key_count, cp_size;
+       size_t count, cp_size;
        unsigned int id;
        GSList *l;
 
@@ -4318,12 +4335,14 @@ static void load_link_keys(struct btd_adapter *adapter, 
GSList *keys,
        if (!(adapter->supported_settings & MGMT_SETTING_BREDR))
                return;
 
-       key_count = g_slist_length(keys);
+       count = g_slist_length(adapter->load_keys);
+       if (!count)
+               return;
 
-       DBG("hci%u keys %zu debug_keys %d", adapter->dev_id, key_count,
-                                                               debug_keys);
+       DBG("hci%u keys %zu debug_keys %d retry %s", adapter->dev_id, count,
+                               debug_keys, retry ? "true" : "false");
 
-       cp_size = sizeof(*cp) + (key_count * sizeof(*key));
+       cp_size = sizeof(*cp) + (count * sizeof(*key));
 
        cp = g_try_malloc0(cp_size);
        if (cp == NULL) {
@@ -4341,13 +4360,18 @@ static void load_link_keys(struct btd_adapter *adapter, 
GSList *keys,
         * behavior for debug keys.
         */
        cp->debug_keys = debug_keys;
-       cp->key_count = htobs(key_count);
+       cp->key_count = htobs(count);
 
-       for (l = keys, key = cp->keys; l != NULL; l = g_slist_next(l), key++) {
+       for (l = adapter->load_keys, key = cp->keys; l != NULL;
+                                       l = g_slist_next(l), key++) {
                struct link_key_info *info = l->data;
 
                bacpy(&key->addr.bdaddr, &info->bdaddr);
-               key->addr.type = info->bdaddr_type;
+               /* Old kernels might only support loading with type set to
+                * BDADDR_BREDR so on retry set that instead of using the stored
+                * info.
+                */
+               key->addr.type = retry ? BDADDR_BREDR : info->bdaddr_type;
                key->type = info->type;
                memcpy(key->val, info->key, 16);
                key->pin_len = info->pin_len;
@@ -4359,9 +4383,12 @@ static void load_link_keys(struct btd_adapter *adapter, 
GSList *keys,
 
        g_free(cp);
 
-       if (id == 0)
+       if (id == 0) {
                btd_error(adapter->dev_id, "Failed to load link keys for hci%u",
                                                        adapter->dev_id);
+               g_slist_free_full(adapter->load_keys, g_free);
+               adapter->load_keys = NULL;
+       }
 }
 
 static void load_ltks_complete(uint8_t status, uint16_t length,
@@ -4873,7 +4900,6 @@ static void load_defaults(struct btd_adapter *adapter)
 static void load_devices(struct btd_adapter *adapter)
 {
        char dirname[PATH_MAX];
-       GSList *keys = NULL;
        GSList *ltks = NULL;
        GSList *irks = NULL;
        GSList *params = NULL;
@@ -4964,7 +4990,8 @@ static void load_devices(struct btd_adapter *adapter)
                }
 
                if (key_info)
-                       keys = g_slist_append(keys, key_info);
+                       adapter->load_keys = g_slist_append(adapter->load_keys,
+                                                               key_info);
 
                if (ltk_info)
                        ltks = g_slist_append(ltks, ltk_info);
@@ -5013,8 +5040,7 @@ static void load_devices(struct btd_adapter *adapter)
 
        closedir(dir);
 
-       load_link_keys(adapter, keys, btd_opts.debug_keys);
-       g_slist_free_full(keys, g_free);
+       load_link_keys(adapter, btd_opts.debug_keys, false);
 
        load_ltks(adapter, ltks);
        g_slist_free_full(ltks, g_free);
@@ -6930,6 +6956,9 @@ static void adapter_remove(struct btd_adapter *adapter)
        g_slist_free(adapter->devices);
        adapter->devices = NULL;
 
+       g_slist_free(adapter->load_keys);
+       adapter->load_keys = NULL;
+
        discovery_cleanup(adapter, 0);
 
        unload_drivers(adapter);

Reply via email to