- Add security fix (CVE-2025-23050, boo#1236237)

* 0001-QLowEnergyControllerPrivateBluez-guard-against-malfo.patch

OBS-URL: https://build.opensuse.org/package/show/KDE:Qt6/qt6-connectivity?expand=0&rev=52
This commit is contained in:
Christophe Marin 2025-01-22 09:09:02 +00:00 committed by Git OBS Bridge
commit 9ad0fd585a
11 changed files with 633 additions and 0 deletions

23
.gitattributes vendored Normal file
View File

@ -0,0 +1,23 @@
## Default LFS
*.7z filter=lfs diff=lfs merge=lfs -text
*.bsp filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.gem filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text
*.lz filter=lfs diff=lfs merge=lfs -text
*.lzma filter=lfs diff=lfs merge=lfs -text
*.obscpio filter=lfs diff=lfs merge=lfs -text
*.oxt filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.rpm filter=lfs diff=lfs merge=lfs -text
*.tbz filter=lfs diff=lfs merge=lfs -text
*.tbz2 filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.txz filter=lfs diff=lfs merge=lfs -text
*.whl filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.osc

View File

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

4
_multibuild Normal file
View File

@ -0,0 +1,4 @@
<multibuild>
<flavor>docs</flavor>
</multibuild>

View File

@ -0,0 +1,5 @@
# using fdupes on include directories means looking for troubles
addFilter("files-duplicate .*")
# library and development package names don't match
addFilter("no-dependency-on .*")

199
qt6-connectivity.changes Normal file
View File

@ -0,0 +1,199 @@
-------------------------------------------------------------------
Wed Jan 22 09:08:10 UTC 2025 - Christophe Marin <christophe@krop.fr>
- Add security fix (CVE-2025-23050, boo#1236237)
* 0001-QLowEnergyControllerPrivateBluez-guard-against-malfo.patch
-------------------------------------------------------------------
Mon Dec 2 13:01:59 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.8.1:
* https://www.qt.io/blog/qt-6.8.1-released
-------------------------------------------------------------------
Tue Oct 8 09:29:41 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.8.0:
* https://www.qt.io/blog/qt-6.8-released
-------------------------------------------------------------------
Sat Sep 28 08:22:56 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.7.3
* https://www.qt.io/blog/qt-6.7.3-released
-------------------------------------------------------------------
Wed Jun 19 07:25:40 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.7.2:
* https://www.qt.io/blog/qt-6.7.2-released
-------------------------------------------------------------------
Tue May 21 08:31:26 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.7.1:
* https://www.qt.io/blog/qt-6.7.1-released
-------------------------------------------------------------------
Tue Apr 2 13:39:37 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.7.0:
* https://www.qt.io/blog/qt-6.7-released
-------------------------------------------------------------------
Tue Mar 26 14:25:30 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.6.3:
* https://www.qt.io/blog/qt-6.6.3-released
-------------------------------------------------------------------
Wed Feb 14 16:53:11 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.6.2
* https://www.qt.io/blog/qt-6.6.2-released
-------------------------------------------------------------------
Mon Nov 27 14:00:07 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.6.1:
* https://www.qt.io/blog/qt-6.6.1-released
-------------------------------------------------------------------
Tue Oct 10 09:39:49 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.6.0
* https://www.qt.io/blog/qt-6.6-released
-------------------------------------------------------------------
Thu Sep 28 07:34:08 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.5.3
* https://www.qt.io/blog/qt-6.5.3-released
-------------------------------------------------------------------
Thu Jul 20 08:44:02 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.5.2
* https://www.qt.io/blog/qt-6.5.2-released-1
-------------------------------------------------------------------
Fri Jun 30 15:13:08 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update subpackages requirements
-------------------------------------------------------------------
Wed May 24 07:45:35 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.5.1
* https://www.qt.io/blog/qt-6.5.1-released
-------------------------------------------------------------------
Mon Apr 3 10:01:53 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.5.0
* https://www.qt.io/blog/qt-6.5-lts-released
-------------------------------------------------------------------
Thu Mar 16 09:59:59 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.4.3:
* https://www.qt.io/blog/qt-6.4.3-released
-------------------------------------------------------------------
Fri Jan 6 16:46:38 UTC 2023 - Christophe Marin <christophe@krop.fr>
- Update to 6.4.2:
* https://www.qt.io/blog/qt-6.4.2-released
-------------------------------------------------------------------
Tue Nov 15 11:53:09 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.4.1:
* https://www.qt.io/blog/qt-6.4.1-released
-------------------------------------------------------------------
Thu Sep 29 10:35:50 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.4.0:
* https://www.qt.io/blog/qt-6.4-released
-------------------------------------------------------------------
Fri Sep 16 08:29:04 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.4.0 RC
-------------------------------------------------------------------
Fri Sep 9 12:41:34 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.3.2:
* https://www.qt.io/blog/qt-6.3.2-released
-------------------------------------------------------------------
Fri Jun 17 15:15:05 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.3.1:
* https://www.qt.io/blog/qt-6.3.1-released
-------------------------------------------------------------------
Fri Apr 8 11:56:52 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.3.0:
* https://www.qt.io/blog/qt-6.3-released
-------------------------------------------------------------------
Tue Mar 29 12:28:31 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.3.0-rc
-------------------------------------------------------------------
Mon Mar 21 08:46:40 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.4
* https://www.qt.io/blog/qt-6.2.4-released
-------------------------------------------------------------------
Mon Jan 31 08:54:26 UTC 2022 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.3:
* https://www.qt.io/blog/qt-6.2.3-released
-------------------------------------------------------------------
Wed Dec 1 10:05:59 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.2
* https://www.qt.io/blog/qt-6.2.2-released
- Make sure all dependencies are present when installing devel
packages. Qt >= 6.2.2 is much less permissive.
-------------------------------------------------------------------
Tue Oct 26 11:22:34 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.1
* https://www.qt.io/blog/qt-6.2.1-released
-------------------------------------------------------------------
Thu Sep 30 12:26:51 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.0:
* https://www.qt.io/blog/qt-6.2-lts-released
-------------------------------------------------------------------
Sat Sep 25 07:18:34 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.0-rc2
-------------------------------------------------------------------
Thu Sep 16 14:07:36 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.0-rc
-------------------------------------------------------------------
Thu Sep 9 14:05:00 UTC 2021 - Christophe Giboudeaux <christophe@krop.fr>
- Update to 6.2.0-beta4
-------------------------------------------------------------------
Sat Feb 1 14:35:48 UTC 2020 - Christophe Giboudeaux <christophe@krop.fr>
- Add qt6-connectivity

163
qt6-connectivity.spec Normal file
View File

@ -0,0 +1,163 @@
#
# spec file for package qt6-connectivity
#
# Copyright (c) 2024 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
%define real_version 6.8.1
%define short_version 6.8
%define tar_name qtconnectivity-everywhere-src
%define tar_suffix %{nil}
#
%global qt6_flavor @BUILD_FLAVOR@%{nil}
%if "%{qt6_flavor}" == "docs"
%define pkg_suffix -docs
%endif
#
Name: qt6-connectivity%{?pkg_suffix}
Version: 6.8.1
Release: 0
Summary: Qt 6 connectivity tools and libraries
License: LGPL-3.0-only OR (GPL-2.0-only OR GPL-3.0-or-later)
URL: https://www.qt.io
Source0: https://download.qt.io/official_releases/qt/%{short_version}/%{real_version}%{tar_suffix}/submodules/%{tar_name}-%{real_version}%{tar_suffix}.tar.xz
Source99: qt6-connectivity-rpmlintrc
# PATCH-FIX-UPSTREAM
Patch0: 0001-QLowEnergyControllerPrivateBluez-guard-against-malfo.patch
BuildRequires: pkgconfig
BuildRequires: qt6-core-private-devel
BuildRequires: qt6-network-private-devel
BuildRequires: cmake(Qt6Core) = %{real_version}
BuildRequires: cmake(Qt6DBus) = %{real_version}
BuildRequires: cmake(Qt6Gui) = %{real_version}
BuildRequires: cmake(Qt6Network) = %{real_version}
BuildRequires: cmake(Qt6Quick) = %{real_version}
BuildRequires: cmake(Qt6QuickControls2) = %{real_version}
BuildRequires: cmake(Qt6Widgets) = %{real_version}
BuildRequires: pkgconfig(bluez)
BuildRequires: pkgconfig(libpcsclite)
%if "%{qt6_flavor}" == "docs"
BuildRequires: qt6-tools
%{qt6_doc_packages}
%endif
%description
Qt 6 connectivity tools and libraries.
%if !%{qt6_docs_flavor}
%package -n libQt6Bluetooth6
Summary: Qt 6 bluetooth library
%description -n libQt6Bluetooth6
Provides access to Bluetooth hardware.
%package -n libQt6Nfc6
Summary: Qt 6 NFC library
%description -n libQt6Nfc6
Provides access to NFC hardware.
%package devel
Summary: Qt 6 connectivity libraries - Development files
Requires: libQt6Bluetooth6 = %{version}
Requires: libQt6Nfc6 = %{version}
# sdoscanner in required by Qt6BluetoothToolsTargets.cmake
Requires: qt6-connectivity = %{version}
Requires: cmake(Qt6DBus) = %{real_version}
Requires: cmake(Qt6Network) = %{real_version}
%description devel
Development files for the Qt6 connectivity libraries.
%package private-devel
Summary: Non-ABI stable API for the Qt 6 connectivity libraries
Requires: cmake(Qt6Bluetooth) = %{real_version}
Requires: cmake(Qt6Nfc) = %{real_version}
%requires_eq qt6-core-private-devel
%requires_eq qt6-network-private-devel
%description private-devel
This package provides private headers of qt6-connectivity that are normally
not used by application development and that do not have any ABI or
API guarantees.
The packages that build against these have to require the exact Qt version.
%{qt6_examples_package}
%endif
%prep
%autosetup -p1 -n %{tar_name}-%{real_version}%{tar_suffix}
%build
%cmake_qt6 \
-DQT_GENERATE_SBOM:BOOL=FALSE
%{qt6_build}
%install
%{qt6_install}
%if !%{qt6_docs_flavor}
%ldconfig_scriptlets -n libQt6Bluetooth6
%ldconfig_scriptlets -n libQt6Nfc6
%files
%{_qt6_libexecdir}/sdpscanner
%files -n libQt6Bluetooth6
%license LICENSES/*
%{_qt6_libdir}/libQt6Bluetooth.so.*
%files -n libQt6Nfc6
%license LICENSES/*
%{_qt6_libdir}/libQt6Nfc.so.*
%files devel
%{_qt6_cmakedir}/Qt6/FindBlueZ.cmake
%{_qt6_cmakedir}/Qt6/FindPCSCLITE.cmake
%{_qt6_cmakedir}/Qt6Bluetooth/
%{_qt6_cmakedir}/Qt6BuildInternals/StandaloneTests/QtConnectivityTestsConfig.cmake
%{_qt6_cmakedir}/Qt6Nfc/
%{_qt6_descriptionsdir}/Bluetooth.json
%{_qt6_descriptionsdir}/Nfc.json
%{_qt6_includedir}/QtBluetooth/
%{_qt6_includedir}/QtNfc/
%{_qt6_libdir}/libQt6Bluetooth.prl
%{_qt6_libdir}/libQt6Bluetooth.so
%{_qt6_libdir}/libQt6Nfc.prl
%{_qt6_libdir}/libQt6Nfc.so
%{_qt6_metatypesdir}/qt6bluetooth*_metatypes.json
%{_qt6_metatypesdir}/qt6nfc_*_metatypes.json
%{_qt6_mkspecsdir}/modules/qt_lib_bluetooth.pri
%{_qt6_mkspecsdir}/modules/qt_lib_nfc.pri
%{_qt6_pkgconfigdir}/Qt6Bluetooth.pc
%{_qt6_pkgconfigdir}/Qt6Nfc.pc
%exclude %{_qt6_includedir}/QtBluetooth/%{real_version}/
%exclude %{_qt6_includedir}/QtNfc/%{real_version}/
%files private-devel
%dir %{_qt6_includedir}/QtBluetooth
%dir %{_qt6_includedir}/QtNfc
%{_qt6_includedir}/QtBluetooth/%{real_version}/
%{_qt6_includedir}/QtNfc/%{real_version}/
%{_qt6_mkspecsdir}/modules/qt_lib_bluetooth_private.pri
%{_qt6_mkspecsdir}/modules/qt_lib_nfc_private.pri
%endif
%changelog

BIN
qtconnectivity-everywhere-src-6.7.2.tar.xz (Stored with Git LFS) Normal file

Binary file not shown.

View File

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

View File

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

View File

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