public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Jan Grulich <jgrulich@redhat.com>
To: git-commits@fedoraproject.org
Subject: [rpms/qt5-qtbase] rawhide: Fix build against OpenSSL 4.0
Date: Tue, 04 Aug 2026 11:26:27 GMT [thread overview]
Message-ID: <178584278745.1.8463740346792437043.rpms-qt5-qtbase-6e6b07507630@fedoraproject.org> (raw)
A new commit has been pushed.
Repo : rpms/qt5-qtbase
Branch : rawhide
Commit : 6e6b075076302c6882da943e4d29f4fad57ca155
Author : Jan Grulich <jgrulich@redhat.com>
Date : 2026-08-04T13:26:15+02:00
Stats : +137/-0 in 2 file(s)
URL : https://src.fedoraproject.org/rpms/qt5-qtbase/c/6e6b075076302c6882da943e4d29f4fad57ca155?branch=rawhide
Log:
Fix build against OpenSSL 4.0
---
diff --git a/qt5-qtbase.spec b/qt5-qtbase.spec
index e434b16..8aaaac0 100644
--- a/qt5-qtbase.spec
+++ b/qt5-qtbase.spec
@@ -162,6 +162,9 @@ Patch103: qtbase-QTBUG-112136.patch
# https://fedoraproject.org/wiki/Changes/dropingOfCertPemFile
Patch104: 0001-Update-SSL-trust-store-locations-for-modern-Red-Hat-.patch
+# Fix build with OpenSSL 4.0
+Patch105: qtbase-openssl4-opaque-structs.patch
+
## Qt 6 backports for better Gtk/GNOME integration
# https://fedoraproject.org/wiki/Changes/Qt_Wayland_By_Default_On_Gnome
# https://bugzilla.redhat.com/show_bug.cgi?id=1732129
@@ -482,6 +485,9 @@ Qt5 libraries used for drawing widgets and OpenGL items.
%patch -P102 -p1
%patch -P103 -p1
%patch -P104 -p1
+%if 0%{?fedora} >= 45
+%patch -P105 -p1
+%endif
## Qt 6 backports
%if 0%{?fedora} > 30 || 0%{?rhel} > 8
diff --git a/qtbase-openssl4-opaque-structs.patch b/qtbase-openssl4-opaque-structs.patch
new file mode 100644
index 0000000..e9a1b21
--- /dev/null
+++ b/qtbase-openssl4-opaque-structs.patch
@@ -0,0 +1,131 @@
+diff --git a/src/network/ssl/qsslcertificate_openssl.cpp b/src/network/ssl/qsslcertificate_openssl.cpp
+index d1794d4d..629b7f67 100644
+--- a/src/network/ssl/qsslcertificate_openssl.cpp
++++ b/src/network/ssl/qsslcertificate_openssl.cpp
+@@ -125,9 +125,10 @@ QByteArray QSslCertificate::serialNumber() const
+ if (d->serialNumberString.isEmpty() && d->x509) {
+ ASN1_INTEGER *serialNumber = q_X509_get_serialNumber(d->x509);
+ QByteArray hexString;
+- hexString.reserve(serialNumber->length * 3);
+- for (int a = 0; a < serialNumber->length; ++a) {
+- hexString += QByteArray::number(serialNumber->data[a], 16).rightJustified(2, '0');
++ hexString.reserve(q_ASN1_STRING_length(serialNumber) * 3);
++ const unsigned char *serialNumberData = q_ASN1_STRING_get0_data(serialNumber);
++ for (int a = 0; a < q_ASN1_STRING_length(serialNumber); ++a) {
++ hexString += QByteArray::number(serialNumberData[a], 16).rightJustified(2, '0');
+ hexString += ':';
+ }
+ hexString.chop(1);
+@@ -251,10 +252,10 @@ QMultiMap<QSsl::AlternativeNameEntryType, QString> QSslCertificate::subjectAlter
+ QHostAddress ipAddress;
+ switch (len) {
+ case 4: // IPv4
+- ipAddress = QHostAddress(qFromBigEndian(*reinterpret_cast<quint32 *>(genName->d.iPAddress->data)));
++ ipAddress = QHostAddress(qFromBigEndian(*reinterpret_cast<const quint32 *>(q_ASN1_STRING_get0_data(genName->d.iPAddress))));
+ break;
+ case 16: // IPv6
+- ipAddress = QHostAddress(reinterpret_cast<quint8 *>(genName->d.iPAddress->data));
++ ipAddress = QHostAddress(reinterpret_cast<const quint8 *>(q_ASN1_STRING_get0_data(genName->d.iPAddress)));
+ break;
+ default: // Unknown IP address format
+ break;
+@@ -511,8 +512,8 @@ static QVariant x509ExtensionToValue(X509_EXTENSION *ext)
+
+ // keyid
+ if (auth_key->keyid) {
+- QByteArray keyid(reinterpret_cast<const char *>(auth_key->keyid->data),
+- auth_key->keyid->length);
++ QByteArray keyid(reinterpret_cast<const char *>(q_ASN1_STRING_get0_data(auth_key->keyid)),
++ q_ASN1_STRING_length(auth_key->keyid));
+ result[QLatin1String("keyid")] = keyid.toHex();
+ }
+
+diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp
+index 6a9a3ef3..78c08720 100644
+--- a/src/network/ssl/qsslsocket_openssl_symbols.cpp
++++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp
+@@ -137,6 +137,18 @@ void qsslSocketCannotResolveSymbolWarning(const char *functionName)
+
+ #endif // QT_LINKED_OPENSSL
+
++// OpenSSL 4.0 changed several getter return types to const.
++// Use const_cast in the linked path to preserve Qt's ABI.
++#ifdef QT_LINKED_OPENSSL
++#define DEFINEFUNC_CONST_RETURN(ret, func, arg, a, err, funcret) \
++ ret q_##func(arg) { funcret const_cast<ret>(func(a)); }
++#define DEFINEFUNC2_CONST_RETURN(ret, func, arg1, a, arg2, b, err, funcret) \
++ ret q_##func(arg1, arg2) { funcret const_cast<ret>(func(a, b)); }
++#else
++#define DEFINEFUNC_CONST_RETURN DEFINEFUNC
++#define DEFINEFUNC2_CONST_RETURN DEFINEFUNC2
++#endif
++
+ DEFINEFUNC(const unsigned char *, ASN1_STRING_get0_data, const ASN1_STRING *a, a, return nullptr, return)
+ DEFINEFUNC2(int, OPENSSL_init_ssl, uint64_t opts, opts, const OPENSSL_INIT_SETTINGS *settings, settings, return 0, return)
+ DEFINEFUNC2(int, OPENSSL_init_crypto, uint64_t opts, opts, const OPENSSL_INIT_SETTINGS *settings, settings, return 0, return)
+@@ -408,31 +420,31 @@ DEFINEFUNC2(int, X509_cmp, X509 *a, a, X509 *b, b, return -1, return)
+ DEFINEFUNC4(int, X509_digest, const X509 *x509, x509, const EVP_MD *type, type, unsigned char *md, md, unsigned int *len, len, return -1, return)
+ DEFINEFUNC(X509 *, X509_dup, X509 *a, a, return nullptr, return)
+ DEFINEFUNC2(void, X509_print, BIO *a, a, X509 *b, b, return, DUMMYARG);
+-DEFINEFUNC(ASN1_OBJECT *, X509_EXTENSION_get_object, X509_EXTENSION *a, a, return nullptr, return)
++DEFINEFUNC_CONST_RETURN(ASN1_OBJECT *, X509_EXTENSION_get_object, X509_EXTENSION *a, a, return nullptr, return)
+ DEFINEFUNC(void, X509_free, X509 *a, a, return, DUMMYARG)
+ //Q_AUTOTEST_EXPORT ASN1_TIME *q_X509_gmtime_adj(ASN1_TIME *s, long adj);
+ DEFINEFUNC2(ASN1_TIME *, X509_gmtime_adj, ASN1_TIME *s, s, long adj, adj, return nullptr, return)
+ DEFINEFUNC(void, ASN1_TIME_free, ASN1_TIME *t, t, return, DUMMYARG)
+-DEFINEFUNC2(X509_EXTENSION *, X509_get_ext, X509 *a, a, int b, b, return nullptr, return)
++DEFINEFUNC2_CONST_RETURN(X509_EXTENSION *, X509_get_ext, X509 *a, a, int b, b, return nullptr, return)
+ DEFINEFUNC(int, X509_get_ext_count, X509 *a, a, return 0, return)
+ DEFINEFUNC4(void *, X509_get_ext_d2i, X509 *a, a, int b, b, int *c, c, int *d, d, return nullptr, return)
+ DEFINEFUNC(const X509V3_EXT_METHOD *, X509V3_EXT_get, X509_EXTENSION *a, a, return nullptr, return)
+ DEFINEFUNC(void *, X509V3_EXT_d2i, X509_EXTENSION *a, a, return nullptr, return)
+ DEFINEFUNC(int, X509_EXTENSION_get_critical, X509_EXTENSION *a, a, return 0, return)
+-DEFINEFUNC(ASN1_OCTET_STRING *, X509_EXTENSION_get_data, X509_EXTENSION *a, a, return nullptr, return)
++DEFINEFUNC_CONST_RETURN(ASN1_OCTET_STRING *, X509_EXTENSION_get_data, X509_EXTENSION *a, a, return nullptr, return)
+ DEFINEFUNC(void, BASIC_CONSTRAINTS_free, BASIC_CONSTRAINTS *a, a, return, DUMMYARG)
+ DEFINEFUNC(void, AUTHORITY_KEYID_free, AUTHORITY_KEYID *a, a, return, DUMMYARG)
+ DEFINEFUNC(void, GENERAL_NAME_free, GENERAL_NAME *a, a, return, DUMMYARG)
+ DEFINEFUNC2(int, ASN1_STRING_print, BIO *a, a, const ASN1_STRING *b, b, return 0, return)
+ DEFINEFUNC2(int, X509_check_issued, X509 *a, a, X509 *b, b, return -1, return)
+-DEFINEFUNC(X509_NAME *, X509_get_issuer_name, X509 *a, a, return nullptr, return)
+-DEFINEFUNC(X509_NAME *, X509_get_subject_name, X509 *a, a, return nullptr, return)
++DEFINEFUNC_CONST_RETURN(X509_NAME *, X509_get_issuer_name, X509 *a, a, return nullptr, return)
++DEFINEFUNC_CONST_RETURN(X509_NAME *, X509_get_subject_name, X509 *a, a, return nullptr, return)
+ DEFINEFUNC(ASN1_INTEGER *, X509_get_serialNumber, X509 *a, a, return nullptr, return)
+ DEFINEFUNC(int, X509_verify_cert, X509_STORE_CTX *a, a, return -1, return)
+ DEFINEFUNC(int, X509_NAME_entry_count, X509_NAME *a, a, return 0, return)
+-DEFINEFUNC2(X509_NAME_ENTRY *, X509_NAME_get_entry, X509_NAME *a, a, int b, b, return nullptr, return)
+-DEFINEFUNC(ASN1_STRING *, X509_NAME_ENTRY_get_data, X509_NAME_ENTRY *a, a, return nullptr, return)
+-DEFINEFUNC(ASN1_OBJECT *, X509_NAME_ENTRY_get_object, X509_NAME_ENTRY *a, a, return nullptr, return)
++DEFINEFUNC2_CONST_RETURN(X509_NAME_ENTRY *, X509_NAME_get_entry, X509_NAME *a, a, int b, b, return nullptr, return)
++DEFINEFUNC_CONST_RETURN(ASN1_STRING *, X509_NAME_ENTRY_get_data, X509_NAME_ENTRY *a, a, return nullptr, return)
++DEFINEFUNC_CONST_RETURN(ASN1_OBJECT *, X509_NAME_ENTRY_get_object, X509_NAME_ENTRY *a, a, return nullptr, return)
+ DEFINEFUNC(EVP_PKEY *, X509_PUBKEY_get, X509_PUBKEY *a, a, return nullptr, return)
+ DEFINEFUNC(void, X509_STORE_free, X509_STORE *a, a, return, DUMMYARG)
+ DEFINEFUNC(X509_STORE *, X509_STORE_new, DUMMYARG, DUMMYARG, return nullptr, return)
+@@ -1254,13 +1266,13 @@ bool q_resolveOpenSslSymbols()
+ //==============================================================================
+ QDateTime q_getTimeFromASN1(const ASN1_TIME *aTime)
+ {
+- size_t lTimeLength = aTime->length;
+- char *pString = (char *) aTime->data;
++ size_t lTimeLength = q_ASN1_STRING_length(const_cast<ASN1_TIME *>(aTime));
++ char *pString = (char *) q_ASN1_STRING_get0_data(aTime);
+ auto isValidPointer = [pString, lTimeLength](const char *const probe){
+ return size_t(probe - pString) < lTimeLength;
+ };
+
+- if (aTime->type == V_ASN1_UTCTIME) {
++ if (ASN1_STRING_type(aTime) == V_ASN1_UTCTIME) {
+
+ char lBuffer[24];
+ char *pBuffer = lBuffer;
+@@ -1333,7 +1345,7 @@ QDateTime q_getTimeFromASN1(const ASN1_TIME *aTime)
+ result = result.addSecs(lSecondsFromUCT);
+ return result;
+
+- } else if (aTime->type == V_ASN1_GENERALIZEDTIME) {
++ } else if (ASN1_STRING_type(aTime) == V_ASN1_GENERALIZEDTIME) {
+
+ if (lTimeLength < 15)
+ return QDateTime(); // hopefully never triggered
reply other threads:[~2026-08-04 11:26 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=178584278745.1.8463740346792437043.rpms-qt5-qtbase-6e6b07507630@fedoraproject.org \
--to=jgrulich@redhat.com \
--cc=git-commits@fedoraproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox