<pre style='margin:0'>
Renee Otten (reneeotten) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/d941f4c6080ccf336a618f4717c4eb27ede225cb">https://github.com/macports/macports-ports/commit/d941f4c6080ccf336a618f4717c4eb27ede225cb</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit d941f4c6080ccf336a618f4717c4eb27ede225cb
</span>Author: Renee Otten <reneeotten@macports.org>
AuthorDate: Mon Jan 27 10:19:10 2025 -0500

<span style='display:block; white-space:pre;color:#404040;'>    qt6-qtconnectivity: patch for CVE-2025-23050
</span>---
 aqua/qt6/Portfile                                  |   6 +-
 .../files/CVE-2025-23050-qtconnectivity-6.8.diff   | 220 +++++++++++++++++++++
 2 files changed, 225 insertions(+), 1 deletion(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/aqua/qt6/Portfile b/aqua/qt6/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index f69c84a73d0..4ad54edd3c1 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/aqua/qt6/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/aqua/qt6/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -262,7 +262,7 @@ array set modules {
</span>         {"Qt Bluetooth" "Qt NFC"}
         ""
         "variant overrides: "
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        "revision 0"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "revision 1"
</span>         "License: "
     }
     qt3d {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1035,6 +1035,10 @@ subport ${name}-qtwebengine {
</span>     }
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+subport ${name}-qtconnectivity {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    patchfiles-append       CVE-2025-23050-qtconnectivity-6.8.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> subport ${name}-qtmultimedia {
     # GStreamer will be found if gstreamer1 and gstreamer1-gst-plugins-base are installed
     # however, an error will ensue since the GStreamer support requires "Linux DMA buffer support"
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/aqua/qt6/files/CVE-2025-23050-qtconnectivity-6.8.diff b/aqua/qt6/files/CVE-2025-23050-qtconnectivity-6.8.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..18606f0fc24
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/aqua/qt6/files/CVE-2025-23050-qtconnectivity-6.8.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,220 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 465e3f3112a9c158aa6dd2f8b9439ae6c2de336f Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Ivan Solovev <ivan.solovev@qt.io>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Thu, 02 Jan 2025 16:48:49 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] QLowEnergyControllerPrivateBluez: guard against malformed replies
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The QLowEnergyControllerPrivateBluez::l2cpReadyRead() slot reads the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+data from a Bluetooth L2CAP socket and then tries to process it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+according to ATT protocol specs.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+However, the code was missing length and sanity checks at some
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+codepaths in processUnsolicitedReply() and processReply() helper
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+methods, simply relying on the data to be in the proper format.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This patch adds some minimal checks to make sure that we do not read
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+past the end of the received array and do not divide by zero.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This problem was originally pointed out by Marc Mutz in an unrelated
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patch.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Pick-to: 6.5 5.15
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Change-Id: I8dcfe031f70ad61fa3d87dc9d771c3fabc6d0edc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Reviewed-by: Juha Vuolle <juha.vuolle@qt.io>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+(cherry picked from commit aecbd657c841a2a8c74631ceac96b8ff1f03ab5c)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+(cherry picked from commit 53e991671f725c136e9aa824c59ec13934c63fb4)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6f0c985..2bd0cb6 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/bluetooth/qlowenergycontroller_bluez.cpp.orig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/bluetooth/qlowenergycontroller_bluez.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -64,14 +64,15 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const int maxPrepareQueueSize = 1024;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-static void dumpErrorInformation(const QByteArray &response)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* returns false if the format is incorrect */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static bool dumpErrorInformation(const QByteArray &response)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     const char *data = response.constData();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (response.size() != 5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         || (static_cast<QBluezConst::AttCommand>(data[0])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             != QBluezConst::AttCommand::ATT_OP_ERROR_RESPONSE)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         qCWarning(QT_BT_BLUEZ) << QLatin1String("Not a valid error response");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     QBluezConst::AttCommand lastCommand = static_cast<QBluezConst::AttCommand>(data[1]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -126,6 +127,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     qCDebug(QT_BT_BLUEZ) << "Error:" << errorCode << "Error description:" << errorString
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                          << "last command:" << lastCommand << "handle:" << handle;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int getUuidSize(const QBluetoothUuid &uuid)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -903,6 +906,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Q_ASSERT(charData);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Q_ASSERT(data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Q_ASSERT(elementLength >= 5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     QLowEnergyHandle attributeHandle = bt_get_le16(&data[0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     charData->properties =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -912,7 +916,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // Bluetooth LE data comes as little endian
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (elementLength == 7) // 16 bit uuid
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         charData->uuid = QBluetoothUuid(bt_get_le16(&data[5]));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    else if (elementLength == 21) // 128 bit uuid
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         charData->uuid = QUuid::fromBytes(&data[5], QSysInfo::LittleEndian);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     qCDebug(QT_BT_BLUEZ) << "Found handle:" << Qt::hex << attributeHandle
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -929,6 +933,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Q_ASSERT(foundServices);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Q_ASSERT(data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Q_ASSERT(elementLength >= 6);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     QLowEnergyHandle attributeHandle = bt_get_le16(&data[0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -938,9 +943,14 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // data[2] -> included service start handle
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // data[4] -> included service end handle
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // TODO: Spec v. 5.3, Vol. 3, Part G, 4.5.1 mentions that only
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // 16-bit UUID can be returned here. If the UUID is 128-bit,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // then it is omitted from the response, and should be requested
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // separately with the ATT_READ_REQ command.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (elementLength == 8) //16 bit uuid
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         foundServices->append(QBluetoothUuid(bt_get_le16(&data[6])));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    else if (elementLength == 22) // 128 bit uuid
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         foundServices->append(QUuid::fromBytes(&data[6], QSysInfo::LittleEndian));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     qCDebug(QT_BT_BLUEZ) << "Found included service: " << Qt::hex
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -949,17 +959,29 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return attributeHandle;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Q_DECL_COLD_FUNCTION
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void reportMalformedData(QBluezConst::AttCommand cmd, const QByteArray &response)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    qCDebug(QT_BT_BLUEZ, "%s malformed data: %s", qt_getEnumName(cmd),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            response.toHex().constData());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void QLowEnergyControllerPrivateBluez::processReply(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         const Request &request, const QByteArray &response)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Q_Q(QLowEnergyController);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // We already have an isEmpty() check at the only calling site that reads
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // incoming data, so Q_ASSERT is enough.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Q_ASSERT(!response.isEmpty());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     QBluezConst::AttCommand command = static_cast<QBluezConst::AttCommand>(response.constData()[0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     bool isErrorResponse = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // if error occurred 2. byte is previous request type
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (command == QBluezConst::AttCommand::ATT_OP_ERROR_RESPONSE) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        dumpErrorInformation(response);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (!dumpErrorInformation(response))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         command = static_cast<QBluezConst::AttCommand>(response.constData()[1]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         isErrorResponse = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -972,6 +994,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (isErrorResponse) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             mtuSize = ATT_DEFAULT_LE_MTU;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if (response.size() < 3) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                reportMalformedData(command, response);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             const char *data = response.constData();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             quint16 mtu = bt_get_le16(&data[1]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             mtuSize = mtu;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1000,8 +1026,15 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        // response[1] == elementLength. According to the spec it should be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        // at least 4 bytes. See Spec v5.3, Vol 3, Part F, 3.4.4.10
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (response.size() < 2 || response[1] < 4) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            reportMalformedData(command, response);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         QLowEnergyHandle start = 0, end = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        const quint16 elementLength = response.constData()[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        const quint16 elementLength = response.constData()[1]; // value checked above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         const quint16 numElements = (response.size() - 2) / elementLength;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         quint16 offset = 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         const char *data = response.constData();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1077,16 +1110,25 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         /* packet format:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-         * if GATT_CHARACTERISTIC discovery
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * if GATT_CHARACTERISTIC discovery (Spec 5.3, Vol. 3, Part G, 4.6)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          *      <opcode><elementLength>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          *          [<handle><property><charHandle><uuid>]+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * The minimum elementLength is 7 bytes (uuid is always included)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-         * if GATT_INCLUDE discovery
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * if GATT_INCLUDE discovery (Spec 5.3, Vol. 3, Part G, 4.5.1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          *      <opcode><elementLength>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          *          [<handle><startHandle_included><endHandle_included><uuid>]+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         *  The minimum elementLength is 6 bytes (uuid can be omitted).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          *  The uuid can be 16 or 128 bit.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        const quint8 minimumElementLength = attributeType == GATT_CHARACTERISTIC ? 7 : 6;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (response.size() < 2 || response[1] < minimumElementLength) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            reportMalformedData(command, response);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         QLowEnergyHandle lastHandle;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         const quint16 elementLength = response.constData()[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         const quint16 numElements = (response.size() - 2) / elementLength;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1283,6 +1325,12 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        // Spec 5.3, Vol. 3, Part F, 3.4.3.2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (response.size() < 6) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            reportMalformedData(command, response);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         const quint8 format = response[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         quint16 elementLength;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         switch (format) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1720,9 +1768,18 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void QLowEnergyControllerPrivateBluez::processUnsolicitedReply(const QByteArray &payload)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Q_ASSERT(!payload.isEmpty());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     const char *data = payload.constData();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    bool isNotification = (static_cast<QBluezConst::AttCommand>(data[0])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const auto command = static_cast<QBluezConst::AttCommand>(data[0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    bool isNotification = (command
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            == QBluezConst::AttCommand::ATT_OP_HANDLE_VAL_NOTIFICATION);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (payload.size() < 3) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        reportMalformedData(command, payload);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     const QLowEnergyHandle changedHandle = bt_get_le16(&data[1]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (QT_BT_BLUEZ().isDebugEnabled()) {
</span></pre><pre style='margin:0'>

</pre>