Accepting request 1123685 from Base:System

- update to 5.70:
  * Fix issue with not sending GATT confirmations.
  * Fix issue with not handling initiator properly.
  * Fix issue with not checking PBAP counter length.
  * Add support for MICP profile and MICS service.
- add Fix-.device_probe-failing-if-SDP-record-is-not.patch to fix
  regression when pairing game controllers

      Sync the change log here. (bsc#1196275, jsc#SLE-20639)
		Requires:       %{name}
	    - Removed
	        --with-dbusconfdir=%{_datadir}  \
              https://www.spinics.net/lists/linux-bluetooth/msg79852.html
            - Move 43xx firmware path for RPi3 bluetooth support bsc#1140688 bsc#995059 bsc#1094902
- Fix path to systemctl in %post script
  (bsc#1013877)(CVE-2016-9804)

OBS-URL: https://build.opensuse.org/request/show/1123685
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/bluez?expand=0&rev=200
This commit is contained in:
Ana Guerrero 2023-11-07 20:25:06 +00:00 committed by Git OBS Bridge
commit a5899b32d7
5 changed files with 335 additions and 12 deletions

View File

@ -0,0 +1,310 @@
From 3a9c637010f8dc1ba3e8382abe01065761d4f5bb Mon Sep 17 00:00:00 2001
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Date: Tue, 10 Oct 2023 12:38:29 -0700
Subject: [PATCH] input: Fix .device_probe failing if SDP record is not found
Due to changes introduced by 67a26abe53bf
("profile: Add probe_on_discover flag") profiles may get probed when
their profile UUID are discovered, rather than resolved, which means
the SDP record may not be available.
Fixes: https://github.com/bluez/bluez/issues/614
---
profiles/input/device.c | 182 +++++++++++++++++++---------------------
1 file changed, 84 insertions(+), 98 deletions(-)
diff --git a/profiles/input/device.c b/profiles/input/device.c
index e2ac6ea60..4a50ea992 100644
--- a/profiles/input/device.c
+++ b/profiles/input/device.c
@@ -60,7 +60,7 @@ struct input_device {
char *path;
bdaddr_t src;
bdaddr_t dst;
- uint32_t handle;
+ const sdp_record_t *rec;
GIOChannel *ctrl_io;
GIOChannel *intr_io;
guint ctrl_watch;
@@ -754,7 +754,8 @@ static void epox_endian_quirk(unsigned char *data, int size)
}
}
-static int create_hid_dev_name(sdp_record_t *rec, struct hidp_connadd_req *req)
+static int create_hid_dev_name(const sdp_record_t *rec,
+ struct hidp_connadd_req *req)
{
char sdesc[sizeof(req->name) / 2];
@@ -776,7 +777,7 @@ static int create_hid_dev_name(sdp_record_t *rec, struct hidp_connadd_req *req)
/* See HID profile specification v1.0, "7.11.6 HIDDescriptorList" for details
* on the attribute format. */
-static int extract_hid_desc_data(sdp_record_t *rec,
+static int extract_hid_desc_data(const sdp_record_t *rec,
struct hidp_connadd_req *req)
{
sdp_data_t *d;
@@ -817,36 +818,40 @@ invalid_desc:
return -EINVAL;
}
-static int extract_hid_record(sdp_record_t *rec, struct hidp_connadd_req *req)
+static int extract_hid_record(struct input_device *idev,
+ struct hidp_connadd_req *req)
{
sdp_data_t *pdlist;
uint8_t attr_val;
int err;
- err = create_hid_dev_name(rec, req);
+ if (!idev->rec)
+ return -ENOENT;
+
+ err = create_hid_dev_name(idev->rec, req);
if (err < 0)
DBG("No valid Service Name or Service Description found");
- pdlist = sdp_data_get(rec, SDP_ATTR_HID_PARSER_VERSION);
+ pdlist = sdp_data_get(idev->rec, SDP_ATTR_HID_PARSER_VERSION);
req->parser = pdlist ? pdlist->val.uint16 : 0x0100;
- pdlist = sdp_data_get(rec, SDP_ATTR_HID_DEVICE_SUBCLASS);
+ pdlist = sdp_data_get(idev->rec, SDP_ATTR_HID_DEVICE_SUBCLASS);
req->subclass = pdlist ? pdlist->val.uint8 : 0;
- pdlist = sdp_data_get(rec, SDP_ATTR_HID_COUNTRY_CODE);
+ pdlist = sdp_data_get(idev->rec, SDP_ATTR_HID_COUNTRY_CODE);
req->country = pdlist ? pdlist->val.uint8 : 0;
- pdlist = sdp_data_get(rec, SDP_ATTR_HID_VIRTUAL_CABLE);
+ pdlist = sdp_data_get(idev->rec, SDP_ATTR_HID_VIRTUAL_CABLE);
attr_val = pdlist ? pdlist->val.uint8 : 0;
if (attr_val)
req->flags |= (1 << HIDP_VIRTUAL_CABLE_UNPLUG);
- pdlist = sdp_data_get(rec, SDP_ATTR_HID_BOOT_DEVICE);
+ pdlist = sdp_data_get(idev->rec, SDP_ATTR_HID_BOOT_DEVICE);
attr_val = pdlist ? pdlist->val.uint8 : 0;
if (attr_val)
req->flags |= (1 << HIDP_BOOT_PROTOCOL_MODE);
- err = extract_hid_desc_data(rec, req);
+ err = extract_hid_desc_data(idev->rec, req);
if (err < 0)
return err;
@@ -1035,11 +1040,6 @@ static gboolean encrypt_notify(GIOChannel *io, GIOCondition condition,
static int hidp_add_connection(struct input_device *idev)
{
struct hidp_connadd_req *req;
- sdp_record_t *rec;
- char src_addr[18], dst_addr[18];
- char filename[PATH_MAX];
- GKeyFile *key_file;
- char handle[11], *str;
GError *gerr = NULL;
int err;
@@ -1049,33 +1049,7 @@ static int hidp_add_connection(struct input_device *idev)
req->flags = 0;
req->idle_to = idle_timeout;
- ba2str(&idev->src, src_addr);
- ba2str(&idev->dst, dst_addr);
-
- snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", src_addr,
- dst_addr);
- sprintf(handle, "0x%8.8X", idev->handle);
-
- 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_clear_error(&gerr);
- }
- str = g_key_file_get_string(key_file, "ServiceRecords", handle, NULL);
- g_key_file_free(key_file);
-
- if (!str) {
- error("Rejected connection from unknown device %s", dst_addr);
- err = -EPERM;
- goto cleanup;
- }
-
- rec = record_from_string(str);
- g_free(str);
-
- err = extract_hid_record(rec, req);
- sdp_record_free(rec);
+ err = extract_hid_record(idev, req);
if (err < 0) {
error("Could not parse HID SDP record: %s (%d)", strerror(-err),
-err);
@@ -1091,7 +1065,7 @@ static int hidp_add_connection(struct input_device *idev)
/* Make sure the device is bonded if required */
if (classic_bonded_only && !input_device_bonded(idev)) {
- error("Rejected connection from !bonded device %s", dst_addr);
+ error("Rejected connection from !bonded device %s", idev->path);
goto cleanup;
}
@@ -1161,6 +1135,68 @@ static int connection_disconnect(struct input_device *idev, uint32_t flags)
return ioctl_disconnect(idev, flags);
}
+static bool is_device_sdp_disable(const sdp_record_t *rec)
+{
+ sdp_data_t *data;
+
+ data = sdp_data_get(rec, SDP_ATTR_HID_SDP_DISABLE);
+
+ return data && data->val.uint8;
+}
+
+static enum reconnect_mode_t hid_reconnection_mode(bool reconnect_initiate,
+ bool normally_connectable)
+{
+ if (!reconnect_initiate && !normally_connectable)
+ return RECONNECT_NONE;
+ else if (!reconnect_initiate && normally_connectable)
+ return RECONNECT_HOST;
+ else if (reconnect_initiate && !normally_connectable)
+ return RECONNECT_DEVICE;
+ else /* (reconnect_initiate && normally_connectable) */
+ return RECONNECT_ANY;
+}
+
+static void extract_hid_props(struct input_device *idev,
+ const sdp_record_t *rec)
+{
+ /* Extract HID connectability */
+ bool reconnect_initiate, normally_connectable;
+ sdp_data_t *pdlist;
+
+ /* HIDNormallyConnectable is optional and assumed FALSE if not
+ * present.
+ */
+ pdlist = sdp_data_get(rec, SDP_ATTR_HID_RECONNECT_INITIATE);
+ reconnect_initiate = pdlist ? pdlist->val.uint8 : TRUE;
+
+ pdlist = sdp_data_get(rec, SDP_ATTR_HID_NORMALLY_CONNECTABLE);
+ normally_connectable = pdlist ? pdlist->val.uint8 : FALSE;
+
+ /* Update local values */
+ idev->reconnect_mode =
+ hid_reconnection_mode(reconnect_initiate, normally_connectable);
+}
+
+static void input_device_update_rec(struct input_device *idev)
+{
+ struct btd_profile *p = btd_service_get_profile(idev->service);
+ const sdp_record_t *rec;
+
+ rec = btd_device_get_record(idev->device, p->remote_uuid);
+ if (!rec || idev->rec == rec)
+ return;
+
+ idev->rec = rec;
+ idev->disable_sdp = is_device_sdp_disable(rec);
+
+ /* Initialize device properties */
+ extract_hid_props(idev, rec);
+
+ if (idev->disable_sdp)
+ device_set_refresh_discovery(idev->device, false);
+}
+
static int input_device_connected(struct input_device *idev)
{
int err;
@@ -1168,6 +1204,9 @@ static int input_device_connected(struct input_device *idev)
if (idev->intr_io == NULL || idev->ctrl_io == NULL)
return -ENOTCONN;
+ /* Attempt to update SDP record if it had changed */
+ input_device_update_rec(idev);
+
err = hidp_add_connection(idev);
if (err < 0)
return err;
@@ -1411,74 +1450,21 @@ int input_device_disconnect(struct btd_service *service)
return 0;
}
-static bool is_device_sdp_disable(const sdp_record_t *rec)
-{
- sdp_data_t *data;
-
- data = sdp_data_get(rec, SDP_ATTR_HID_SDP_DISABLE);
-
- return data && data->val.uint8;
-}
-
-static enum reconnect_mode_t hid_reconnection_mode(bool reconnect_initiate,
- bool normally_connectable)
-{
- if (!reconnect_initiate && !normally_connectable)
- return RECONNECT_NONE;
- else if (!reconnect_initiate && normally_connectable)
- return RECONNECT_HOST;
- else if (reconnect_initiate && !normally_connectable)
- return RECONNECT_DEVICE;
- else /* (reconnect_initiate && normally_connectable) */
- return RECONNECT_ANY;
-}
-
-static void extract_hid_props(struct input_device *idev,
- const sdp_record_t *rec)
-{
- /* Extract HID connectability */
- bool reconnect_initiate, normally_connectable;
- sdp_data_t *pdlist;
-
- /* HIDNormallyConnectable is optional and assumed FALSE
- * if not present. */
- pdlist = sdp_data_get(rec, SDP_ATTR_HID_RECONNECT_INITIATE);
- reconnect_initiate = pdlist ? pdlist->val.uint8 : TRUE;
-
- pdlist = sdp_data_get(rec, SDP_ATTR_HID_NORMALLY_CONNECTABLE);
- normally_connectable = pdlist ? pdlist->val.uint8 : FALSE;
-
- /* Update local values */
- idev->reconnect_mode =
- hid_reconnection_mode(reconnect_initiate, normally_connectable);
-}
-
static struct input_device *input_device_new(struct btd_service *service)
{
struct btd_device *device = btd_service_get_device(service);
- struct btd_profile *p = btd_service_get_profile(service);
const char *path = device_get_path(device);
- const sdp_record_t *rec = btd_device_get_record(device, p->remote_uuid);
struct btd_adapter *adapter = device_get_adapter(device);
struct input_device *idev;
- if (!rec)
- return NULL;
-
idev = g_new0(struct input_device, 1);
bacpy(&idev->src, btd_adapter_get_address(adapter));
bacpy(&idev->dst, device_get_address(device));
idev->service = btd_service_ref(service);
idev->device = btd_device_ref(device);
idev->path = g_strdup(path);
- idev->handle = rec->handle;
- idev->disable_sdp = is_device_sdp_disable(rec);
-
- /* Initialize device properties */
- extract_hid_props(idev, rec);
- if (idev->disable_sdp)
- device_set_refresh_discovery(device, false);
+ input_device_update_rec(idev);
return idev;
}
--
2.42.0

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bc5a35ddc7c72d0d3999a0d7b2175c8b7d57ab670774f8b5b4900ff38a2627fc
size 2335728

BIN
bluez-5.70.tar.xz (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -1,3 +1,14 @@
-------------------------------------------------------------------
Mon Nov 6 21:20:03 UTC 2023 - Dirk Müller <dmueller@suse.com>
- update to 5.70:
* Fix issue with not sending GATT confirmations.
* Fix issue with not handling initiator properly.
* Fix issue with not checking PBAP counter length.
* Add support for MICP profile and MICS service.
- add Fix-.device_probe-failing-if-SDP-record-is-not.patch to fix
regression when pairing game controllers
-------------------------------------------------------------------
Wed Oct 4 09:51:22 UTC 2023 - Joey Lee <jlee@suse.com>
@ -119,7 +130,7 @@ Wed Oct 26 07:18:39 UTC 2022 - Joey Lee <jlee@suse.com>
to sync with bluez.changes in SLE15-SP5.
- Install modprobe.conf files to %_modprobedir
This change already in bluez.sepc in openSUSE:Factory/bluez.
Sync the change log here. (bsc#1196275, jsc#SLE-20639)
Sync the change log here. (bsc#1196275, jsc#SLE-20639)
-------------------------------------------------------------------
Tue Oct 4 03:20:40 UTC 2022 - Joey Lee <jlee@suse.com>
@ -148,7 +159,7 @@ Mon Oct 3 05:21:03 UTC 2022 - Joey Lee <jlee@suse.com>
to
Obsoletes: bluez-libs < 3.36
- In %package cups, add the following statements
Requires: %{name}
Requires: %{name}
Requires: cups
Supplements: (%{name} and cups)
- In %package test
@ -160,7 +171,7 @@ Mon Oct 3 05:21:03 UTC 2022 - Joey Lee <jlee@suse.com>
- Add %package obexd and %package zsh-completion
and their %description
- In %prep
- Removed
- Removed
%setup -q
- Removed
# FIXME: Change the dbus service to be a real service, not systemd launched
@ -168,7 +179,7 @@ Mon Oct 3 05:21:03 UTC 2022 - Joey Lee <jlee@suse.com>
sed -i "/SystemdService=.*/d" obexd/src/org.bluez.obex.service
# END FIXME
- In %build, add
--with-dbusconfdir=%{_datadir} \
--with-dbusconfdir=%{_datadir} \
- In %install
- Removed
# FIXME: Do not delete the systemd service once we support systemd user/session services
@ -215,12 +226,12 @@ Wed Sep 14 07:56:19 UTC 2022 - Joey Lee <jlee@suse.com>
- hcidump-Fix-memory-leak-with-malformed-packet.patch
- bsc#1015171 CVE-2016-9917
- Al Cho has sent it to upstream but it not be merged:
https://www.spinics.net/lists/linux-bluetooth/msg79852.html
https://www.spinics.net/lists/linux-bluetooth/msg79852.html
- hcidump-Fixed-malformed-segment-frame-length.patch
- bsc#1013712 CVE-2016-9798
- Did not send to upstream.
- 0001-rpi3-bcm43xx-The-UART-speed-must-be-reset-after-the-firmw.patch
- Move 43xx firmware path for RPi3 bluetooth support bsc#1140688 bsc#995059 bsc#1094902
- Move 43xx firmware path for RPi3 bluetooth support bsc#1140688 bsc#995059 bsc#1094902
- From https://www.yoctoproject.org/pipermail/yocto/2016-April/029424.html
- Respin the following patches
- bluez-test-2to3.diff
@ -519,7 +530,7 @@ Wed Mar 18 08:29:49 UTC 2020 - Al Cho <acho@suse.com>
-------------------------------------------------------------------
Mon Feb 10 10:05:33 UTC 2020 - Ismail Dönmez <idonmez@suse.com>
- Fix path to systemctl in %post script
- Fix path to systemctl in %post script
-------------------------------------------------------------------
Mon Dec 16 14:27:14 UTC 2019 - Stefan Seyfried <seife+obs@b1-systems.com>
@ -692,7 +703,7 @@ Fri May 11 07:14:16 UTC 2018 - acho@suse.com
(bsc#1013721)(CVE-2016-9800)
CVE-2016-9804-tool-hcidump-Fix-memory-leak-with-malformed-packet.patch
* Fix hcidump buffer overflow in commands_dump().
(bsc#1013877)(CVE-2016-9804)
(bsc#1013877)(CVE-2016-9804)
-------------------------------------------------------------------
Mon Mar 26 06:04:01 UTC 2018 - seife+obs@b1-systems.com

View File

@ -35,7 +35,7 @@
%endif
Name: bluez
Version: 5.69
Version: 5.70
Release: 0
Summary: Bluetooth Stack for Linux
License: GPL-2.0-or-later
@ -54,6 +54,8 @@ Patch2: bluez-sdp-unix-path.patch
Patch3: bluez-cups-libexec.patch
# workaround for broken tests (reported upstream but not yet fixed)
Patch4: bluez-disable-broken-tests.diff
# PATCH-FIX-UPSTREAM: fix regression in pairing gamepads -- https://github.com/bluez/bluez/issues/614
Patch5: Fix-.device_probe-failing-if-SDP-record-is-not.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