Date: Monday, June 14, 2021 @ 17:25:37
  Author: andyrtr
Revision: 418225

upgpkg: bluez 5.59-2: fix Gnome bluetooth toggle - FS#71243

Added:
  bluez/trunk/0001-rfkill-Fix-reading-from-rfkill-socket.patch
Modified:
  bluez/trunk/PKGBUILD

--------------------------------------------------+
 0001-rfkill-Fix-reading-from-rfkill-socket.patch |   83 +++++++++++++++++++++
 PKGBUILD                                         |   12 ++-
 2 files changed, 93 insertions(+), 2 deletions(-)

Added: 0001-rfkill-Fix-reading-from-rfkill-socket.patch
===================================================================
--- 0001-rfkill-Fix-reading-from-rfkill-socket.patch                            
(rev 0)
+++ 0001-rfkill-Fix-reading-from-rfkill-socket.patch    2021-06-14 17:25:37 UTC 
(rev 418225)
@@ -0,0 +1,83 @@
+From 382646b490c1c336dd32f9186293616ceb4d808b Mon Sep 17 00:00:00 2001
+From: Benjamin Berg <[email protected]>
+Date: Mon, 3 May 2021 14:45:00 +0200
+Subject: [PATCH 1/2] rfkill: Fix reading from rfkill socket
+
+The kernel will always send exactly one event, but the size of the
+passed struct will depend on the length of the submitted read() and the
+kernel version. i.e. the interface can be extended and we need to expect
+for a read to be longer than expected if we ask for it.
+
+Fix this by only requesting the needed length and explicitly check the
+length against the V1 version of the structure to make the code a bit
+more future proof in case the internal copy of the struct is updated to
+contain new fields.
+---
+ src/rfkill.c | 24 +++++++++++-------------
+ 1 file changed, 11 insertions(+), 13 deletions(-)
+
+diff --git a/src/rfkill.c b/src/rfkill.c
+index ec9fcdfdd..2099c5ac5 100644
+--- a/src/rfkill.c
++++ b/src/rfkill.c
+@@ -53,12 +53,12 @@ struct rfkill_event {
+       uint8_t  soft;
+       uint8_t  hard;
+ };
++#define RFKILL_EVENT_SIZE_V1    8
+ 
+ static gboolean rfkill_event(GIOChannel *chan,
+                               GIOCondition cond, gpointer data)
+ {
+-      unsigned char buf[32];
+-      struct rfkill_event *event = (void *) buf;
++      struct rfkill_event event = { 0 };
+       struct btd_adapter *adapter;
+       char sysname[PATH_MAX];
+       ssize_t len;
+@@ -69,34 +69,32 @@ static gboolean rfkill_event(GIOChannel *chan,
+ 
+       fd = g_io_channel_unix_get_fd(chan);
+ 
+-      memset(buf, 0, sizeof(buf));
+-
+-      len = read(fd, buf, sizeof(buf));
++      len = read(fd, &event, sizeof(event));
+       if (len < 0) {
+               if (errno == EAGAIN)
+                       return TRUE;
+               return FALSE;
+       }
+ 
+-      if (len != sizeof(struct rfkill_event))
++      if (len < RFKILL_EVENT_SIZE_V1)
+               return TRUE;
+ 
+       DBG("RFKILL event idx %u type %u op %u soft %u hard %u",
+-                                      event->idx, event->type, event->op,
+-                                              event->soft, event->hard);
++                                      event.idx, event.type, event.op,
++                                              event.soft, event.hard);
+ 
+-      if (event->soft || event->hard)
++      if (event.soft || event.hard)
+               return TRUE;
+ 
+-      if (event->op != RFKILL_OP_CHANGE)
++      if (event.op != RFKILL_OP_CHANGE)
+               return TRUE;
+ 
+-      if (event->type != RFKILL_TYPE_BLUETOOTH &&
+-                                      event->type != RFKILL_TYPE_ALL)
++      if (event.type != RFKILL_TYPE_BLUETOOTH &&
++                                      event.type != RFKILL_TYPE_ALL)
+               return TRUE;
+ 
+       snprintf(sysname, sizeof(sysname) - 1,
+-                      "/sys/class/rfkill/rfkill%u/name", event->idx);
++                      "/sys/class/rfkill/rfkill%u/name", event.idx);
+ 
+       fd = open(sysname, O_RDONLY);
+       if (fd < 0)
+-- 
+2.31.1

Modified: PKGBUILD
===================================================================
--- PKGBUILD    2021-06-14 17:19:09 UTC (rev 418224)
+++ PKGBUILD    2021-06-14 17:25:37 UTC (rev 418225)
@@ -6,7 +6,7 @@
 pkgbase=bluez
 pkgname=('bluez' 'bluez-utils' 'bluez-libs' 'bluez-cups' 'bluez-hid2hci' 
'bluez-plugins')
 pkgver=5.59
-pkgrel=1
+pkgrel=2
 url="http://www.bluez.org/";
 arch=('x86_64')
 license=('GPL2')
@@ -13,13 +13,21 @@
 makedepends=('dbus' 'libical' 'systemd' 'alsa-lib' 'json-c' 'ell' 
'python-docutils')
 
source=(https://www.kernel.org/pub/linux/bluetooth/${pkgname}-${pkgver}.tar.{xz,sign}
         bluetooth.modprobe
+        0001-rfkill-Fix-reading-from-rfkill-socket.patch
 )
 # see https://www.kernel.org/pub/linux/bluetooth/sha256sums.asc
 sha256sums=('046b95b386d0bfb2a16311fe799d517ee7735045512d89902c4ed701db477316'
             'SKIP'
-            '46c021be659c9a1c4e55afd04df0c059af1f3d98a96338236412e449bf7477b4')
+            '46c021be659c9a1c4e55afd04df0c059af1f3d98a96338236412e449bf7477b4'
+            'befc9c56fa15fe276916d299e70901d09aedc25d5a29ee444e78fa76f297e72f')
 validpgpkeys=('E932D120BC2AEC444E558F0106CA9F5D1DCF2659') # Marcel Holtmann 
<[email protected]>
 
+prepare() {
+  cd "${pkgname}"-${pkgver}
+  # https://bugs.archlinux.org/task/71243
+  patch -Np1 -i ../0001-rfkill-Fix-reading-from-rfkill-socket.patch
+}
+
 build() {
   cd "${pkgname}"-${pkgver}
   ./configure \

Reply via email to