Compare commits
1 Commits
Author | SHA256 | Date | |
---|---|---|---|
ff493b6674 |
244
0001-HTTP2-Delay-any-communication-until-encrypted-can-be.patch
Normal file
244
0001-HTTP2-Delay-any-communication-until-encrypted-can-be.patch
Normal file
@@ -0,0 +1,244 @@
|
|||||||
|
From 2b1e36e183ce75c224305c7a94457b92f7a5cf58 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= <marten.nordheim@qt.io>
|
||||||
|
Date: Tue, 25 Jun 2024 17:09:35 +0200
|
||||||
|
Subject: [PATCH] HTTP2: Delay any communication until encrypted() can be
|
||||||
|
responded to
|
||||||
|
|
||||||
|
We have the encrypted() signal that lets users do extra checks on the
|
||||||
|
established connection. It is emitted as BlockingQueued, so the HTTP
|
||||||
|
thread stalls until it is done emitting. Users can potentially call
|
||||||
|
abort() on the QNetworkReply at that point, which is passed as a Queued
|
||||||
|
call back to the HTTP thread. That means that any currently queued
|
||||||
|
signal emission will be processed before the abort() call is processed.
|
||||||
|
|
||||||
|
In the case of HTTP2 it is a little special since it is multiplexed and
|
||||||
|
the code is built to start requests as they are available. This means
|
||||||
|
that, while the code worked fine for HTTP1, since one connection only
|
||||||
|
has one request, it is not working for HTTP2, since we try to send more
|
||||||
|
requests in-between the encrypted() signal and the abort() call.
|
||||||
|
|
||||||
|
This patch changes the code to delay any communication until the
|
||||||
|
encrypted() signal has been emitted and processed, for HTTP2 only.
|
||||||
|
It's done by adding a few booleans, both to know that we have to return
|
||||||
|
early and so we can keep track of what events arose and what we need to
|
||||||
|
resume once enough time has passed that any abort() call must have been
|
||||||
|
processed.
|
||||||
|
|
||||||
|
Fixes: QTBUG-126610
|
||||||
|
Pick-to: 6.5 6.2 5.15 5.12
|
||||||
|
Change-Id: Ic25a600c278203256e35f541026f34a8783235ae
|
||||||
|
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
|
||||||
|
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
|
||||||
|
(cherry picked from commit b1e75376cc3adfc7da5502a277dfe9711f3e0536)
|
||||||
|
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
|
||||||
|
(cherry picked from commit 0fb43e4395da34d561814242a0186999e4956e28)
|
||||||
|
---
|
||||||
|
src/network/access/qhttp2protocolhandler.cpp | 6 +--
|
||||||
|
.../access/qhttpnetworkconnectionchannel.cpp | 48 ++++++++++++++++++-
|
||||||
|
.../access/qhttpnetworkconnectionchannel_p.h | 6 +++
|
||||||
|
tests/auto/network/access/http2/tst_http2.cpp | 44 +++++++++++++++++
|
||||||
|
4 files changed, 99 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/network/access/qhttp2protocolhandler.cpp b/src/network/access/qhttp2protocolhandler.cpp
|
||||||
|
index 0abd99b9bc..3631b13dc8 100644
|
||||||
|
--- a/src/network/access/qhttp2protocolhandler.cpp
|
||||||
|
+++ b/src/network/access/qhttp2protocolhandler.cpp
|
||||||
|
@@ -303,12 +303,12 @@ bool QHttp2ProtocolHandler::sendRequest()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!prefaceSent && !sendClientPreface())
|
||||||
|
- return false;
|
||||||
|
-
|
||||||
|
if (!requests.size())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
+ if (!prefaceSent && !sendClientPreface())
|
||||||
|
+ return false;
|
||||||
|
+
|
||||||
|
m_channel->state = QHttpNetworkConnectionChannel::WritingState;
|
||||||
|
// Check what was promised/pushed, maybe we do not have to send a request
|
||||||
|
// and have a response already?
|
||||||
|
diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp
|
||||||
|
index 6766989690..1e4161d1fd 100644
|
||||||
|
--- a/src/network/access/qhttpnetworkconnectionchannel.cpp
|
||||||
|
+++ b/src/network/access/qhttpnetworkconnectionchannel.cpp
|
||||||
|
@@ -209,6 +209,10 @@ void QHttpNetworkConnectionChannel::abort()
|
||||||
|
bool QHttpNetworkConnectionChannel::sendRequest()
|
||||||
|
{
|
||||||
|
Q_ASSERT(protocolHandler);
|
||||||
|
+ if (waitingForPotentialAbort) {
|
||||||
|
+ needInvokeSendRequest = true;
|
||||||
|
+ return false; // this return value is unused
|
||||||
|
+ }
|
||||||
|
return protocolHandler->sendRequest();
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -221,21 +225,28 @@ bool QHttpNetworkConnectionChannel::sendRequest()
|
||||||
|
void QHttpNetworkConnectionChannel::sendRequestDelayed()
|
||||||
|
{
|
||||||
|
QMetaObject::invokeMethod(this, [this] {
|
||||||
|
- Q_ASSERT(protocolHandler);
|
||||||
|
if (reply)
|
||||||
|
- protocolHandler->sendRequest();
|
||||||
|
+ sendRequest();
|
||||||
|
}, Qt::ConnectionType::QueuedConnection);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QHttpNetworkConnectionChannel::_q_receiveReply()
|
||||||
|
{
|
||||||
|
Q_ASSERT(protocolHandler);
|
||||||
|
+ if (waitingForPotentialAbort) {
|
||||||
|
+ needInvokeReceiveReply = true;
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
protocolHandler->_q_receiveReply();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QHttpNetworkConnectionChannel::_q_readyRead()
|
||||||
|
{
|
||||||
|
Q_ASSERT(protocolHandler);
|
||||||
|
+ if (waitingForPotentialAbort) {
|
||||||
|
+ needInvokeReadyRead = true;
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
protocolHandler->_q_readyRead();
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1239,7 +1250,18 @@ void QHttpNetworkConnectionChannel::_q_encrypted()
|
||||||
|
if (!h2RequestsToSend.isEmpty()) {
|
||||||
|
// Similar to HTTP/1.1 counterpart below:
|
||||||
|
const auto &pair = std::as_const(h2RequestsToSend).first();
|
||||||
|
+ waitingForPotentialAbort = true;
|
||||||
|
emit pair.second->encrypted();
|
||||||
|
+
|
||||||
|
+ // We don't send or handle any received data until any effects from
|
||||||
|
+ // emitting encrypted() have been processed. This is necessary
|
||||||
|
+ // because the user may have called abort(). We may also abort the
|
||||||
|
+ // whole connection if the request has been aborted and there is
|
||||||
|
+ // no more requests to send.
|
||||||
|
+ QMetaObject::invokeMethod(this,
|
||||||
|
+ &QHttpNetworkConnectionChannel::checkAndResumeCommunication,
|
||||||
|
+ Qt::QueuedConnection);
|
||||||
|
+
|
||||||
|
// In case our peer has sent us its settings (window size, max concurrent streams etc.)
|
||||||
|
// let's give _q_receiveReply a chance to read them first ('invokeMethod', QueuedConnection).
|
||||||
|
}
|
||||||
|
@@ -1257,6 +1279,28 @@ void QHttpNetworkConnectionChannel::_q_encrypted()
|
||||||
|
QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
+void QHttpNetworkConnectionChannel::checkAndResumeCommunication()
|
||||||
|
+{
|
||||||
|
+ Q_ASSERT(connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
|
||||||
|
+ || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct);
|
||||||
|
+
|
||||||
|
+ // Because HTTP/2 requires that we send a SETTINGS frame as the first thing we do, and respond
|
||||||
|
+ // to a SETTINGS frame with an ACK, we need to delay any handling until we can ensure that any
|
||||||
|
+ // effects from emitting encrypted() have been processed.
|
||||||
|
+ // This function is called after encrypted() was emitted, so check for changes.
|
||||||
|
+
|
||||||
|
+ if (!reply && h2RequestsToSend.isEmpty())
|
||||||
|
+ abort();
|
||||||
|
+ waitingForPotentialAbort = false;
|
||||||
|
+ if (needInvokeReadyRead)
|
||||||
|
+ _q_readyRead();
|
||||||
|
+ if (needInvokeReceiveReply)
|
||||||
|
+ _q_receiveReply();
|
||||||
|
+ if (needInvokeSendRequest)
|
||||||
|
+ sendRequest();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void QHttpNetworkConnectionChannel::requeueHttp2Requests()
|
||||||
|
{
|
||||||
|
const auto h2RequestsToSendCopy = std::exchange(h2RequestsToSend, {});
|
||||||
|
diff --git a/src/network/access/qhttpnetworkconnectionchannel_p.h b/src/network/access/qhttpnetworkconnectionchannel_p.h
|
||||||
|
index c42290feca..061f20fd42 100644
|
||||||
|
--- a/src/network/access/qhttpnetworkconnectionchannel_p.h
|
||||||
|
+++ b/src/network/access/qhttpnetworkconnectionchannel_p.h
|
||||||
|
@@ -74,6 +74,10 @@ public:
|
||||||
|
QAbstractSocket *socket;
|
||||||
|
bool ssl;
|
||||||
|
bool isInitialized;
|
||||||
|
+ bool waitingForPotentialAbort = false;
|
||||||
|
+ bool needInvokeReceiveReply = false;
|
||||||
|
+ bool needInvokeReadyRead = false;
|
||||||
|
+ bool needInvokeSendRequest = false;
|
||||||
|
ChannelState state;
|
||||||
|
QHttpNetworkRequest request; // current request, only used for HTTP
|
||||||
|
QHttpNetworkReply *reply; // current reply for this request, only used for HTTP
|
||||||
|
@@ -146,6 +150,8 @@ public:
|
||||||
|
void closeAndResendCurrentRequest();
|
||||||
|
void resendCurrentRequest();
|
||||||
|
|
||||||
|
+ void checkAndResumeCommunication();
|
||||||
|
+
|
||||||
|
bool isSocketBusy() const;
|
||||||
|
bool isSocketWriting() const;
|
||||||
|
bool isSocketWaiting() const;
|
||||||
|
diff --git a/tests/auto/network/access/http2/tst_http2.cpp b/tests/auto/network/access/http2/tst_http2.cpp
|
||||||
|
index 00efbc9832..c02e7b7b5b 100644
|
||||||
|
--- a/tests/auto/network/access/http2/tst_http2.cpp
|
||||||
|
+++ b/tests/auto/network/access/http2/tst_http2.cpp
|
||||||
|
@@ -106,6 +106,8 @@ private slots:
|
||||||
|
|
||||||
|
void duplicateRequestsWithAborts();
|
||||||
|
|
||||||
|
+ void abortOnEncrypted();
|
||||||
|
+
|
||||||
|
protected slots:
|
||||||
|
// Slots to listen to our in-process server:
|
||||||
|
void serverStarted(quint16 port);
|
||||||
|
@@ -1479,6 +1481,48 @@ void tst_Http2::duplicateRequestsWithAborts()
|
||||||
|
QCOMPARE(finishedCount, ExpectedSuccessfulRequests);
|
||||||
|
}
|
||||||
|
|
||||||
|
+void tst_Http2::abortOnEncrypted()
|
||||||
|
+{
|
||||||
|
+#if !QT_CONFIG(ssl)
|
||||||
|
+ QSKIP("TLS support is needed for this test");
|
||||||
|
+#else
|
||||||
|
+ clearHTTP2State();
|
||||||
|
+ serverPort = 0;
|
||||||
|
+
|
||||||
|
+ ServerPtr targetServer(newServer(defaultServerSettings, H2Type::h2Direct));
|
||||||
|
+
|
||||||
|
+ QMetaObject::invokeMethod(targetServer.data(), "startServer", Qt::QueuedConnection);
|
||||||
|
+ runEventLoop();
|
||||||
|
+
|
||||||
|
+ nRequests = 1;
|
||||||
|
+ nSentRequests = 0;
|
||||||
|
+
|
||||||
|
+ const auto url = requestUrl(H2Type::h2Direct);
|
||||||
|
+ QNetworkRequest request(url);
|
||||||
|
+ request.setAttribute(QNetworkRequest::Http2DirectAttribute, true);
|
||||||
|
+
|
||||||
|
+ std::unique_ptr<QNetworkReply> reply{manager->get(request)};
|
||||||
|
+ reply->ignoreSslErrors();
|
||||||
|
+ connect(reply.get(), &QNetworkReply::encrypted, reply.get(), [reply = reply.get()](){
|
||||||
|
+ reply->abort();
|
||||||
|
+ });
|
||||||
|
+ connect(reply.get(), &QNetworkReply::errorOccurred, this, &tst_Http2::replyFinishedWithError);
|
||||||
|
+
|
||||||
|
+ runEventLoop();
|
||||||
|
+ STOP_ON_FAILURE
|
||||||
|
+
|
||||||
|
+ QCOMPARE(nRequests, 0);
|
||||||
|
+ QCOMPARE(reply->error(), QNetworkReply::OperationCanceledError);
|
||||||
|
+
|
||||||
|
+ const bool res = QTest::qWaitFor(
|
||||||
|
+ [this, server = targetServer.get()]() {
|
||||||
|
+ return serverGotSettingsACK || prefaceOK || nSentRequests > 0;
|
||||||
|
+ },
|
||||||
|
+ 500);
|
||||||
|
+ QVERIFY(!res);
|
||||||
|
+#endif // QT_CONFIG(ssl)
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void tst_Http2::serverStarted(quint16 port)
|
||||||
|
{
|
||||||
|
serverPort = port;
|
||||||
|
--
|
||||||
|
2.45.2
|
||||||
|
|
@@ -1,51 +0,0 @@
|
|||||||
From a43c7e58046604796aa69974ea1c5d3e2648c755 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Thiago Macieira <thiago.macieira@intel.com>
|
|
||||||
Date: Fri, 24 Jan 2025 11:07:58 -0800
|
|
||||||
Subject: [PATCH] QLibraryInfo: speed up checking if ":/qt/etc/qt.conf"
|
|
||||||
resource exists
|
|
||||||
|
|
||||||
Go straight for QResource, because this is run very early in Qt's
|
|
||||||
initialization, usually as a result of some debug message, via
|
|
||||||
QLoggingRegistry::initializeRules(). This bypasses the need to create
|
|
||||||
QResourceFileEnginePrivate, QResourceFileEngine, QFileInfoPrivate, and
|
|
||||||
QFileInfo, all of which would end up in this .isValid() call.
|
|
||||||
|
|
||||||
Additionally, I'm making it query in the C locale, which will also avoid
|
|
||||||
initializing the system & default QLocales. If a resource exists in any
|
|
||||||
language, the C locale query will find it.
|
|
||||||
|
|
||||||
Task-number: QTBUG-133206
|
|
||||||
Change-Id: I434b498903d793c12d35fffd3e297bfdbdc1b6fe
|
|
||||||
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
|
|
||||||
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
|
|
||||||
(cherry picked from commit d59e640c868f3db2d661970f3d34a22013d49053)
|
|
||||||
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
|
|
||||||
(cherry picked from commit ae2502b4ad3d1215211bf4ed44037a40f52a313d)
|
|
||||||
---
|
|
||||||
src/corelib/global/qlibraryinfo.cpp | 3 ++-
|
|
||||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp
|
|
||||||
index 94f3e60deba..5f6042be29d 100644
|
|
||||||
--- a/src/corelib/global/qlibraryinfo.cpp
|
|
||||||
+++ b/src/corelib/global/qlibraryinfo.cpp
|
|
||||||
@@ -6,6 +6,7 @@
|
|
||||||
#include "qstringlist.h"
|
|
||||||
#include "qfile.h"
|
|
||||||
#if QT_CONFIG(settings)
|
|
||||||
+#include "qresource.h"
|
|
||||||
#include "qsettings.h"
|
|
||||||
#endif
|
|
||||||
#include "qlibraryinfo.h"
|
|
||||||
@@ -103,7 +104,7 @@ static std::unique_ptr<QSettings> findConfiguration()
|
|
||||||
return std::make_unique<QSettings>(*qtconfManualPath, QSettings::IniFormat);
|
|
||||||
|
|
||||||
QString qtconfig = QStringLiteral(":/qt/etc/qt.conf");
|
|
||||||
- if (QFile::exists(qtconfig))
|
|
||||||
+ if (QResource(qtconfig, QLocale::c()).isValid())
|
|
||||||
return std::make_unique<QSettings>(qtconfig, QSettings::IniFormat);
|
|
||||||
#ifdef Q_OS_DARWIN
|
|
||||||
CFBundleRef bundleRef = CFBundleGetMainBundle();
|
|
||||||
--
|
|
||||||
2.48.1
|
|
||||||
|
|
@@ -1,49 +0,0 @@
|
|||||||
From 12d4bf1ab52748cb84894f50d437064b439e0b7d Mon Sep 17 00:00:00 2001
|
|
||||||
From: Thiago Macieira <thiago.macieira@intel.com>
|
|
||||||
Date: Fri, 24 Jan 2025 10:43:38 -0800
|
|
||||||
Subject: [PATCH] QLocale: try to survive being created during application shut
|
|
||||||
down
|
|
||||||
|
|
||||||
QLocale is very often accessed during global static destructors, so
|
|
||||||
let's try and survive if the default has already been destroyed. In that
|
|
||||||
case, we shall fall back to the C locale.
|
|
||||||
|
|
||||||
I've placed the call to systemData(), which updates the system locale,
|
|
||||||
before the initialization of defaultLocalePrivate, as the initialization
|
|
||||||
of the latter depends on the former.
|
|
||||||
|
|
||||||
Task-number: QTBUG-133206
|
|
||||||
Change-Id: I48e29b45f9be4514336cfffdf5affa5631a956a3
|
|
||||||
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
|
|
||||||
Reviewed-by: Albert Astals Cid <aacid@kde.org>
|
|
||||||
(cherry picked from commit e0a1f491567f2495443babc5aa36a038260f96c6)
|
|
||||||
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
|
|
||||||
(cherry picked from commit bcc0e6124a2ec80df535178d056324433f9ff984)
|
|
||||||
---
|
|
||||||
src/corelib/text/qlocale.cpp | 9 ++++++---
|
|
||||||
1 file changed, 6 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp
|
|
||||||
index 4f5b5452648..eff083b3d94 100644
|
|
||||||
--- a/src/corelib/text/qlocale.cpp
|
|
||||||
+++ b/src/corelib/text/qlocale.cpp
|
|
||||||
@@ -1112,10 +1112,13 @@ QLocale::QLocale(QStringView name)
|
|
||||||
*/
|
|
||||||
|
|
||||||
QLocale::QLocale()
|
|
||||||
- : d(*defaultLocalePrivate)
|
|
||||||
+ : d(c_private())
|
|
||||||
{
|
|
||||||
- // Make sure system data is up to date:
|
|
||||||
- systemData();
|
|
||||||
+ if (!defaultLocalePrivate.isDestroyed()) {
|
|
||||||
+ // Make sure system data is up to date:
|
|
||||||
+ systemData();
|
|
||||||
+ d = *defaultLocalePrivate;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
--
|
|
||||||
2.48.1
|
|
||||||
|
|
@@ -1,49 +0,0 @@
|
|||||||
From 2ef615228bba9a8eb282437bfb7472f925610e89 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Thiago Macieira <thiago.macieira@intel.com>
|
|
||||||
Date: Fri, 24 Jan 2025 10:28:30 -0800
|
|
||||||
Subject: [PATCH] QSystemLocale: bail out if accessed post-destruction
|
|
||||||
|
|
||||||
There's little we can do, but a lot of content ends up in QLocale very
|
|
||||||
late in the execution. Let's at least not crash.
|
|
||||||
|
|
||||||
Task-number: QTBUG-133206
|
|
||||||
Change-Id: I77d41141cb115147f9befffdd5e69dac19c96044
|
|
||||||
Reviewed-by: Albert Astals Cid <aacid@kde.org>
|
|
||||||
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
|
|
||||||
(cherry picked from commit e32f28034ad2383393645777bcd96eab3f696076)
|
|
||||||
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
|
|
||||||
(cherry picked from commit d5c5f9f3529b384d0d4bea2d51f0ad6a3d57481d)
|
|
||||||
---
|
|
||||||
src/corelib/text/qlocale_unix.cpp | 2 ++
|
|
||||||
src/corelib/text/qlocale_win.cpp | 2 ++
|
|
||||||
2 files changed, 4 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/src/corelib/text/qlocale_unix.cpp b/src/corelib/text/qlocale_unix.cpp
|
|
||||||
index a934f24c016..91dbb74c207 100644
|
|
||||||
--- a/src/corelib/text/qlocale_unix.cpp
|
|
||||||
+++ b/src/corelib/text/qlocale_unix.cpp
|
|
||||||
@@ -127,6 +127,8 @@ QLocale QSystemLocale::fallbackLocale() const
|
|
||||||
QVariant QSystemLocale::query(QueryType type, QVariant &&in) const
|
|
||||||
{
|
|
||||||
QSystemLocaleData *d = qSystemLocaleData();
|
|
||||||
+ if (!d)
|
|
||||||
+ return QVariant();
|
|
||||||
|
|
||||||
if (type == LocaleChanged) {
|
|
||||||
d->readEnvironment();
|
|
||||||
diff --git a/src/corelib/text/qlocale_win.cpp b/src/corelib/text/qlocale_win.cpp
|
|
||||||
index 9fdb46a4c92..793751daaf0 100644
|
|
||||||
--- a/src/corelib/text/qlocale_win.cpp
|
|
||||||
+++ b/src/corelib/text/qlocale_win.cpp
|
|
||||||
@@ -828,6 +828,8 @@ QLocale QSystemLocale::fallbackLocale() const
|
|
||||||
QVariant QSystemLocale::query(QueryType type, QVariant &&in) const
|
|
||||||
{
|
|
||||||
QSystemLocalePrivate *d = systemLocalePrivate();
|
|
||||||
+ if (!d)
|
|
||||||
+ return QVariant();
|
|
||||||
switch(type) {
|
|
||||||
case DecimalPoint:
|
|
||||||
return d->decimalPoint();
|
|
||||||
--
|
|
||||||
2.48.1
|
|
||||||
|
|
48
gcc14.patch
Normal file
48
gcc14.patch
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
From 39fa7e7bef90be2940c5f736935f963e3969e0bd Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dmitry Shachnev <mitya57@gmail.com>
|
||||||
|
Date: Sat, 27 Jul 2024 23:03:07 +0300
|
||||||
|
Subject: [PATCH] Use _Float16 only when SSE2 is enabled
|
||||||
|
|
||||||
|
The GCC documentation [1] says: “On x86 targets with SSE2 enabled, GCC
|
||||||
|
supports half-precision (16-bit) floating point via the _Float16 type”.
|
||||||
|
|
||||||
|
On non-SSE2 x86 (such as Debian i386 baseline [2]), __FLT16_MAX__ is
|
||||||
|
defined starting with GCC 14 [3], however any non-trivial use of the
|
||||||
|
_Float16 type results in an error:
|
||||||
|
|
||||||
|
error: operation not permitted on type ‘_Float16’ without option ‘-msse2’
|
||||||
|
|
||||||
|
which makes some packages fail to build on i386 architecture [4].
|
||||||
|
|
||||||
|
[1]: https://gcc.gnu.org/onlinedocs/gcc/Half-Precision.html
|
||||||
|
[2]: https://wiki.debian.org/ArchitectureSpecificsMemo#i386-1
|
||||||
|
[3]: https://gcc.gnu.org/g:9a19fa8b616f83474c35cc5b34a3865073ced829
|
||||||
|
[4]: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1076986
|
||||||
|
|
||||||
|
Pick-to: 6.8 6.7 6.5
|
||||||
|
Change-Id: I393ee83eb8e8888f5fc9e3b349dc8b063eef6f5a
|
||||||
|
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
|
||||||
|
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
|
||||||
|
---
|
||||||
|
|
||||||
|
diff --git a/src/corelib/global/qtypes.h b/src/corelib/global/qtypes.h
|
||||||
|
index db9ba38..28458f6 100644
|
||||||
|
--- a/src/corelib/global/qtypes.h
|
||||||
|
+++ b/src/corelib/global/qtypes.h
|
||||||
|
@@ -263,13 +263,12 @@
|
||||||
|
// disabled due to https://github.com/llvm/llvm-project/issues/56963
|
||||||
|
# define QFLOAT16_IS_NATIVE 1
|
||||||
|
using NativeFloat16Type = decltype(__FLT16_MAX__);
|
||||||
|
-#elif defined(Q_CC_GNU_ONLY) && defined(__FLT16_MAX__)
|
||||||
|
+#elif defined(Q_CC_GNU_ONLY) && defined(__FLT16_MAX__) && defined(__ARM_FP16_FORMAT_IEEE)
|
||||||
|
# define QFLOAT16_IS_NATIVE 1
|
||||||
|
-# ifdef __ARM_FP16_FORMAT_IEEE
|
||||||
|
using NativeFloat16Type = __fp16;
|
||||||
|
-# else
|
||||||
|
+#elif defined(Q_CC_GNU_ONLY) && defined(__FLT16_MAX__) && defined(__SSE2__)
|
||||||
|
+# define QFLOAT16_IS_NATIVE 1
|
||||||
|
using NativeFloat16Type = _Float16;
|
||||||
|
-# endif
|
||||||
|
#else
|
||||||
|
# define QFLOAT16_IS_NATIVE 0
|
||||||
|
using NativeFloat16Type = void;
|
@@ -1,70 +1,3 @@
|
|||||||
-------------------------------------------------------------------
|
|
||||||
Thu Feb 6 13:44:48 UTC 2025 - Christophe Marin <christophe@krop.fr>
|
|
||||||
|
|
||||||
- Drop patches:
|
|
||||||
* 0001-Revert-QThread-Unix-move-the-pthread_key-to-a-file-s.patch
|
|
||||||
* 0002-Revert-QThread-Unix-revert-to-pthread-destruction-in.patch
|
|
||||||
- Add patches (kde#499537, QTBUG-133500, QTBUG-130278)
|
|
||||||
* 0001-QLocale-try-to-survive-being-created-during-applicat.patch
|
|
||||||
* 0001-QSystemLocale-bail-out-if-accessed-post-destruction.patch
|
|
||||||
* 0001-QLibraryInfo-speed-up-checking-if-qt-etc-qt.conf-res.patch
|
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
|
||||||
Wed Feb 5 09:54:18 UTC 2025 - Fabian Vogt <fabian@ritter-vogt.de>
|
|
||||||
|
|
||||||
- Add patches to avoid crashes on exit (kde#499537):
|
|
||||||
* 0001-Revert-QThread-Unix-move-the-pthread_key-to-a-file-s.patch
|
|
||||||
* 0002-Revert-QThread-Unix-revert-to-pthread-destruction-in.patch
|
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
|
||||||
Fri Jan 31 10:22:52 UTC 2025 - Christophe Marin <christophe@krop.fr>
|
|
||||||
|
|
||||||
- Update to 6.8.2
|
|
||||||
https://www.qt.io/blog/qt-6.8.2-released
|
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
|
||||||
Mon Dec 2 13:01:57 UTC 2024 - Christophe Marin <christophe@krop.fr>
|
|
||||||
|
|
||||||
- Update to 6.8.1:
|
|
||||||
* https://www.qt.io/blog/qt-6.8.1-released
|
|
||||||
- Drop patches, merged upstream:
|
|
||||||
* 0001-QAbstractItemModelPrivate-add-resetting-member.patch
|
|
||||||
* 0001-QUuid-restore-sorting-order-of-Qt-6.8.patch
|
|
||||||
* 0001-QDirIterator-don-t-crash-with-next-after-hasNext-ret.patch
|
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
|
||||||
Tue Oct 22 06:59:37 UTC 2024 - Christophe Marin <christophe@krop.fr>
|
|
||||||
|
|
||||||
- Add patch to fix qxmpp test failures (gh#qxmpp-project/qxmpp#659):
|
|
||||||
* 0001-QUuid-restore-sorting-order-of-Qt-6.8.patch
|
|
||||||
- Add patch to fix potential crash with QDirIterator (QTBUG-130142):
|
|
||||||
* 0001-QDirIterator-don-t-crash-with-next-after-hasNext-ret.patch
|
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
|
||||||
Tue Oct 8 09:29:39 UTC 2024 - Christophe Marin <christophe@krop.fr>
|
|
||||||
|
|
||||||
- Update to 6.8.0:
|
|
||||||
* https://www.qt.io/blog/qt-6.8-released
|
|
||||||
- Add upstream change (needed for kde 493116's bugfix):
|
|
||||||
* 0001-QAbstractItemModelPrivate-add-resetting-member.patch
|
|
||||||
- Drop patch, merged upstream:
|
|
||||||
* 0001-Revert-xcb-handle-XI2-input-button-and-motion-events.patch
|
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
|
||||||
Tue Oct 1 22:23:35 UTC 2024 - Christophe Marin <christophe@krop.fr>
|
|
||||||
|
|
||||||
- Add upstream fix:
|
|
||||||
* 0001-Revert-xcb-handle-XI2-input-button-and-motion-events.patch
|
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
|
||||||
Sat Sep 28 08:22:54 UTC 2024 - Christophe Marin <christophe@krop.fr>
|
|
||||||
|
|
||||||
- Update to 6.7.3
|
|
||||||
* https://www.qt.io/blog/qt-6.7.3-released
|
|
||||||
- Drop patches, merged upstream:
|
|
||||||
* gcc14.patch
|
|
||||||
* 0001-HTTP2-Delay-any-communication-until-encrypted-can-be.patch
|
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Wed Aug 7 12:46:16 UTC 2024 - Filip Kastl <filip.kastl@suse.com>
|
Wed Aug 7 12:46:16 UTC 2024 - Filip Kastl <filip.kastl@suse.com>
|
||||||
|
|
||||||
|
@@ -16,8 +16,8 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
%define real_version 6.8.2
|
%define real_version 6.7.2
|
||||||
%define short_version 6.8
|
%define short_version 6.7
|
||||||
%define tar_name qtbase-everywhere-src
|
%define tar_name qtbase-everywhere-src
|
||||||
%define tar_suffix %{nil}
|
%define tar_suffix %{nil}
|
||||||
#
|
#
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
%bcond_without system_md4c
|
%bcond_without system_md4c
|
||||||
%endif
|
%endif
|
||||||
Name: qt6-base%{?pkg_suffix}
|
Name: qt6-base%{?pkg_suffix}
|
||||||
Version: 6.8.2
|
Version: 6.7.2
|
||||||
Release: 0
|
Release: 0
|
||||||
Summary: Qt 6 core components (Core, Gui, Widgets, Network...)
|
Summary: Qt 6 core components (Core, Gui, Widgets, Network...)
|
||||||
# Legal: qtpaths is BSD-3-Clause
|
# Legal: qtpaths is BSD-3-Clause
|
||||||
@@ -42,10 +42,7 @@ 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
|
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-base-rpmlintrc
|
Source99: qt6-base-rpmlintrc
|
||||||
# Patches 0-100 are upstream patches #
|
# Patches 0-100 are upstream patches #
|
||||||
# https://bugs.kde.org/show_bug.cgi?id=499537
|
Patch0: gcc14.patch
|
||||||
Patch0: 0001-QLocale-try-to-survive-being-created-during-applicat.patch
|
|
||||||
Patch1: 0001-QSystemLocale-bail-out-if-accessed-post-destruction.patch
|
|
||||||
Patch2: 0001-QLibraryInfo-speed-up-checking-if-qt-etc-qt.conf-res.patch
|
|
||||||
# Patches 100-200 are openSUSE and/or non-upstream(able) patches #
|
# Patches 100-200 are openSUSE and/or non-upstream(able) patches #
|
||||||
# No need to pollute the library dir with object files, install them in the qt6 subfolder
|
# No need to pollute the library dir with object files, install them in the qt6 subfolder
|
||||||
Patch100: 0001-CMake-Install-objects-files-into-ARCHDATADIR.patch
|
Patch100: 0001-CMake-Install-objects-files-into-ARCHDATADIR.patch
|
||||||
@@ -53,6 +50,7 @@ Patch100: 0001-CMake-Install-objects-files-into-ARCHDATADIR.patch
|
|||||||
Patch101: 0001-Use-newer-GCC-on-Leap.patch
|
Patch101: 0001-Use-newer-GCC-on-Leap.patch
|
||||||
%endif
|
%endif
|
||||||
Patch102: 0001-Don-t-strip-binaries-when-building-with-qmake.patch
|
Patch102: 0001-Don-t-strip-binaries-when-building-with-qmake.patch
|
||||||
|
Patch103: 0001-HTTP2-Delay-any-communication-until-encrypted-can-be.patch
|
||||||
##
|
##
|
||||||
BuildRequires: cmake >= 3.18.3
|
BuildRequires: cmake >= 3.18.3
|
||||||
BuildRequires: cups-devel
|
BuildRequires: cups-devel
|
||||||
@@ -449,8 +447,6 @@ report generation facilities.
|
|||||||
|
|
||||||
%package -n qt6-printsupport-devel
|
%package -n qt6-printsupport-devel
|
||||||
Summary: Development files for the Qt 6 PrintSupport library
|
Summary: Development files for the Qt 6 PrintSupport library
|
||||||
# Due to QTBUG-87776, the dependency needs to be in qt6-printsupport-devel
|
|
||||||
Requires: cups-devel
|
|
||||||
Requires: libQt6PrintSupport6 = %{version}
|
Requires: libQt6PrintSupport6 = %{version}
|
||||||
Requires: cmake(Qt6Core) = %{real_version}
|
Requires: cmake(Qt6Core) = %{real_version}
|
||||||
Requires: cmake(Qt6Gui) = %{real_version}
|
Requires: cmake(Qt6Gui) = %{real_version}
|
||||||
@@ -461,6 +457,8 @@ Development files for the Qt 6 PrintSupport library.
|
|||||||
|
|
||||||
%package -n qt6-printsupport-private-devel
|
%package -n qt6-printsupport-private-devel
|
||||||
Summary: Non-ABI stable API for the Qt 6 PrintSupport library
|
Summary: Non-ABI stable API for the Qt 6 PrintSupport library
|
||||||
|
# Includes <cups/ppd.h> in qprint_p.h
|
||||||
|
Requires: cups-devel
|
||||||
Requires: qt6-core-private-devel = %{version}
|
Requires: qt6-core-private-devel = %{version}
|
||||||
Requires: qt6-gui-private-devel = %{version}
|
Requires: qt6-gui-private-devel = %{version}
|
||||||
Requires: qt6-widgets-private-devel = %{version}
|
Requires: qt6-widgets-private-devel = %{version}
|
||||||
@@ -744,9 +742,6 @@ installed on your system.
|
|||||||
cp src/3rdparty/freetype/LICENSE.txt src/gui/painting/FREETYPE_LICENSE.txt
|
cp src/3rdparty/freetype/LICENSE.txt src/gui/painting/FREETYPE_LICENSE.txt
|
||||||
sed -i 's#../../3rdparty/freetype/LICENSE.txt#FREETYPE_LICENSE.txt#' src/gui/painting/qt_attribution.json
|
sed -i 's#../../3rdparty/freetype/LICENSE.txt#FREETYPE_LICENSE.txt#' src/gui/painting/qt_attribution.json
|
||||||
|
|
||||||
# Same thing for blake2
|
|
||||||
sed -i '/\/3rdparty\/blake2/d' src/corelib/CMakeLists.txt
|
|
||||||
|
|
||||||
# We don't want to use these 3rdparty libraries
|
# We don't want to use these 3rdparty libraries
|
||||||
rm -r src/3rdparty/{blake2,double-conversion,freetype,harfbuzz-ng,libjpeg,libpng,pcre2,sqlite,xcb,zlib}
|
rm -r src/3rdparty/{blake2,double-conversion,freetype,harfbuzz-ng,libjpeg,libpng,pcre2,sqlite,xcb,zlib}
|
||||||
%if %{with system_md4c}
|
%if %{with system_md4c}
|
||||||
@@ -788,15 +783,11 @@ sed -i '/zstd CONFIG/d' cmake/FindWrapZSTD.cmake
|
|||||||
-DQT_BUILD_TESTS:BOOL=FALSE \
|
-DQT_BUILD_TESTS:BOOL=FALSE \
|
||||||
-DQT_CREATE_VERSIONED_HARD_LINK:BOOL=FALSE \
|
-DQT_CREATE_VERSIONED_HARD_LINK:BOOL=FALSE \
|
||||||
-DQT_DISABLE_RPATH:BOOL=FALSE \
|
-DQT_DISABLE_RPATH:BOOL=FALSE \
|
||||||
-DQT_GENERATE_SBOM:BOOL=FALSE \
|
|
||||||
-DQT_SBOM_GENERATE_JSON:BOOL=FALSE \
|
|
||||||
-DQT_SBOM_VERIFY:BOOL=FALSE \
|
|
||||||
%ifnarch ppc64
|
%ifnarch ppc64
|
||||||
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION:BOOL=TRUE \
|
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION:BOOL=TRUE \
|
||||||
%endif
|
%endif
|
||||||
-DFEATURE_elf_private_full_version=TRUE \
|
-DFEATURE_elf_private_full_version=TRUE \
|
||||||
-DFEATURE_enable_new_dtags:BOOL=TRUE \
|
-DFEATURE_enable_new_dtags:BOOL=TRUE \
|
||||||
-DFEATURE_forkfd_pidfd:BOOL=FALSE \
|
|
||||||
-DFEATURE_journald:BOOL=TRUE \
|
-DFEATURE_journald:BOOL=TRUE \
|
||||||
-DFEATURE_libproxy:BOOL=TRUE \
|
-DFEATURE_libproxy:BOOL=TRUE \
|
||||||
-DFEATURE_reduce_relocations:BOOL=FALSE \
|
-DFEATURE_reduce_relocations:BOOL=FALSE \
|
||||||
@@ -805,6 +796,7 @@ sed -i '/zstd CONFIG/d' cmake/FindWrapZSTD.cmake
|
|||||||
-DFEATURE_system_xcb_xinput:BOOL=TRUE \
|
-DFEATURE_system_xcb_xinput:BOOL=TRUE \
|
||||||
-DFEATURE_xcb_native_painting:BOOL=TRUE \
|
-DFEATURE_xcb_native_painting:BOOL=TRUE \
|
||||||
-DINPUT_openssl:STRING=linked \
|
-DINPUT_openssl:STRING=linked \
|
||||||
|
-DFEATURE_forkfd_pidfd:BOOL=FALSE \
|
||||||
%if 0%{?with_gles}
|
%if 0%{?with_gles}
|
||||||
-DINPUT_opengl:STRING=es2 \
|
-DINPUT_opengl:STRING=es2 \
|
||||||
-DFEATURE_opengles3:BOOL=TRUE
|
-DFEATURE_opengles3:BOOL=TRUE
|
||||||
@@ -836,20 +828,12 @@ rm %{buildroot}%{_qt6_mkspecsdir}/modules/qt_lib_openglwidgets_private.pri
|
|||||||
|
|
||||||
# These files are only useful for the Qt continuous integration
|
# These files are only useful for the Qt continuous integration
|
||||||
rm %{buildroot}%{_qt6_libexecdir}/ensure_pro_file.cmake
|
rm %{buildroot}%{_qt6_libexecdir}/ensure_pro_file.cmake
|
||||||
rm %{buildroot}%{_qt6_libexecdir}/qt-android-runner.py
|
|
||||||
rm %{buildroot}%{_qt6_libexecdir}/qt-testrunner.py
|
rm %{buildroot}%{_qt6_libexecdir}/qt-testrunner.py
|
||||||
rm %{buildroot}%{_qt6_libexecdir}/sanitizer-testrunner.py
|
rm %{buildroot}%{_qt6_libexecdir}/sanitizer-testrunner.py
|
||||||
|
|
||||||
# This is only for Apple platforms and has a python2 dep
|
# This is only for Apple platforms and has a python2 dep
|
||||||
rm -r %{buildroot}%{_qt6_mkspecsdir}/features/uikit
|
rm -r %{buildroot}%{_qt6_mkspecsdir}/features/uikit
|
||||||
|
|
||||||
# Not useful for desktop installs
|
|
||||||
rm -r %{buildroot}%{_qt6_cmakedir}/Qt6ExamplesAssetDownloaderPrivate
|
|
||||||
rm -r %{buildroot}%{_qt6_includedir}/QtExamplesAssetDownloader
|
|
||||||
rm %{buildroot}%{_qt6_descriptionsdir}/ExamplesAssetDownloaderPrivate.json
|
|
||||||
rm %{buildroot}%{_qt6_libdir}/libQt6ExamplesAssetDownloader.*
|
|
||||||
rm %{buildroot}%{_qt6_metatypesdir}/qt6examplesassetdownloaderprivate_*_metatypes.json
|
|
||||||
|
|
||||||
%ldconfig_scriptlets -n libQt6Concurrent6
|
%ldconfig_scriptlets -n libQt6Concurrent6
|
||||||
%ldconfig_scriptlets -n libQt6Core6
|
%ldconfig_scriptlets -n libQt6Core6
|
||||||
%ldconfig_scriptlets -n libQt6DBus6
|
%ldconfig_scriptlets -n libQt6DBus6
|
||||||
@@ -1213,8 +1197,8 @@ rm %{buildroot}%{_qt6_metatypesdir}/qt6examplesassetdownloaderprivate_*_metatype
|
|||||||
%{_qt6_libdir}/libQt6ExampleIcons.prl
|
%{_qt6_libdir}/libQt6ExampleIcons.prl
|
||||||
# There's no mistake, this folder needs to be installed
|
# There's no mistake, this folder needs to be installed
|
||||||
# These are CMake objects files which are not part of any library
|
# These are CMake objects files which are not part of any library
|
||||||
%dir %{_qt6_archdatadir}/objects-*
|
%dir %{_qt6_archdatadir}/objects-RelWithDebInfo
|
||||||
%{_qt6_archdatadir}/objects-*/ExampleIconsPrivate_resources_1/
|
%{_qt6_archdatadir}/objects-RelWithDebInfo/ExampleIconsPrivate_resources_1/
|
||||||
%{_qt6_metatypesdir}/qt6exampleiconsprivate_*_metatypes.json
|
%{_qt6_metatypesdir}/qt6exampleiconsprivate_*_metatypes.json
|
||||||
|
|
||||||
%files -n qt6-kmssupport-devel-static
|
%files -n qt6-kmssupport-devel-static
|
||||||
|
BIN
qtbase-everywhere-src-6.7.2.tar.xz
(Stored with Git LFS)
Normal file
BIN
qtbase-everywhere-src-6.7.2.tar.xz
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
qtbase-everywhere-src-6.8.2.tar.xz
(Stored with Git LFS)
BIN
qtbase-everywhere-src-6.8.2.tar.xz
(Stored with Git LFS)
Binary file not shown.
Reference in New Issue
Block a user