diff --git a/0001-Avoid-resetting-CMAKE_AUTOMOC_MACRO_NAMES.patch b/0001-Avoid-resetting-CMAKE_AUTOMOC_MACRO_NAMES.patch new file mode 100644 index 0000000..1f77e12 --- /dev/null +++ b/0001-Avoid-resetting-CMAKE_AUTOMOC_MACRO_NAMES.patch @@ -0,0 +1,36 @@ +From 9bcb5cbfb07052ffd24c4a419bf20bd63a842591 Mon Sep 17 00:00:00 2001 +From: Amir Masoud Abdol +Date: Tue, 28 Feb 2023 10:32:13 +0100 +Subject: [PATCH] Avoid resetting CMAKE_AUTOMOC_MACRO_NAMES + +Instead of overwriting the CMAKE_AUTOMOC_MACRO_NAMES, we try to append +our desired moc names to it, and don't get rid of what's there. + +Thanks for Friedrich W. H. Kossebau for filling a descriptive bug report +and offering a solution as well. + +Fixes: QTBUG-110497 +Change-Id: I582af431151cacfe24085b890ae9dba0a0e53f3f +Reviewed-by: Alexey Edelev +(cherry picked from commit 38ee9ee8497291c899c2a72e0ed24bfffe9ced4e) +--- + src/corelib/Qt6CoreConfigExtras.cmake.in | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/corelib/Qt6CoreConfigExtras.cmake.in b/src/corelib/Qt6CoreConfigExtras.cmake.in +index 8b4d3164cf..4a95625854 100644 +--- a/src/corelib/Qt6CoreConfigExtras.cmake.in ++++ b/src/corelib/Qt6CoreConfigExtras.cmake.in +@@ -26,7 +26,8 @@ if (NOT QT_NO_CREATE_TARGETS) + set_property(TARGET ${__qt_core_target} PROPERTY INTERFACE_COMPILE_FEATURES cxx_decltype) + endif() + +-set(CMAKE_AUTOMOC_MACRO_NAMES "Q_OBJECT" "Q_GADGET" "Q_GADGET_EXPORT" "Q_NAMESPACE" "Q_NAMESPACE_EXPORT") ++list(APPEND CMAKE_AUTOMOC_MACRO_NAMES Q_OBJECT Q_GADGET Q_GADGET_EXPORT Q_NAMESPACE Q_NAMESPACE_EXPORT) ++list(REMOVE_DUPLICATES CMAKE_AUTOMOC_MACRO_NAMES) + + # install layout information, following what qmake -query provides + get_filename_component(QT@PROJECT_VERSION_MAJOR@_INSTALL_PREFIX ${CMAKE_CURRENT_LIST_DIR}/../@QT_INVERSE_CONFIG_INSTALL_DIR@ ABSOLUTE) +-- +2.39.2 + diff --git a/CVE-2023-24607-qtbase-6.4.diff b/CVE-2023-24607-qtbase-6.4.diff deleted file mode 100644 index 5c3efa7..0000000 --- a/CVE-2023-24607-qtbase-6.4.diff +++ /dev/null @@ -1,339 +0,0 @@ -CVE-2023-24607 cumulative fixes (https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-24607) - -Origin: https://www.qt.io/blog/security-advisory-qt-sql-odbc-driver-plugin - - ---- a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp -+++ b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp -@@ -58,23 +58,39 @@ inline static QString fromSQLTCHAR(const QVarLengthArray& input, qsize - return result; - } - -+template -+void toSQLTCHARImpl(QVarLengthArray &result, const QString &input); // primary template undefined -+ -+template -+void do_append(QVarLengthArray &result, const Container &c) -+{ -+ result.append(reinterpret_cast(c.data()), c.size()); -+} -+ -+template <> -+void toSQLTCHARImpl<1>(QVarLengthArray &result, const QString &input) -+{ -+ const auto u8 = input.toUtf8(); -+ do_append(result, u8); -+} -+ -+template <> -+void toSQLTCHARImpl<2>(QVarLengthArray &result, const QString &input) -+{ -+ do_append(result, input); -+} -+ -+template <> -+void toSQLTCHARImpl<4>(QVarLengthArray &result, const QString &input) -+{ -+ const auto u32 = input.toUcs4(); -+ do_append(result, u32); -+} -+ - inline static QVarLengthArray toSQLTCHAR(const QString &input) - { - QVarLengthArray result; -- result.resize(input.size()); -- switch(sizeof(SQLTCHAR)) { -- case 1: -- memcpy(result.data(), input.toUtf8().data(), input.size()); -- break; -- case 2: -- memcpy(result.data(), input.unicode(), input.size() * 2); -- break; -- case 4: -- memcpy(result.data(), input.toUcs4().data(), input.size() * 4); -- break; -- default: -- qCritical("sizeof(SQLTCHAR) is %d. Don't know how to handle this.", int(sizeof(SQLTCHAR))); -- } -+ toSQLTCHARImpl(result, input); - result.append(0); // make sure it's null terminated, doesn't matter if it already is, it does if it isn't. - return result; - } - ---- a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp -+++ b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp -@@ -1740,10 +1740,11 @@ bool QODBCResult::exec() - case QMetaType::QString: - if (d->unicode) { - if (bindValueType(i) & QSql::Out) { -- const QByteArray &first = tmpStorage.at(i); -- QVarLengthArray array; -- array.append((const SQLTCHAR *)first.constData(), first.size()); -- values[i] = fromSQLTCHAR(array, first.size()/sizeof(SQLTCHAR)); -+ const QByteArray &bytes = tmpStorage.at(i); -+ const auto strSize = bytes.size() / sizeof(SQLTCHAR); -+ QVarLengthArray string(strSize); -+ memcpy(string.data(), bytes.data(), strSize * sizeof(SQLTCHAR)); -+ values[i] = fromSQLTCHAR(string); - } - break; - } - - ---- a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp -+++ b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp -@@ -745,6 +745,14 @@ QChar QODBCDriverPrivate::quoteChar() - return quote; - } - -+static SQLRETURN qt_string_SQLSetConnectAttr(SQLHDBC handle, SQLINTEGER attr, const QString &val) -+{ -+ auto encoded = toSQLTCHAR(val); -+ return SQLSetConnectAttr(handle, attr, -+ encoded.data(), -+ SQLINTEGER(encoded.size() * sizeof(SQLTCHAR))); // size in bytes -+} -+ - - bool QODBCDriverPrivate::setConnectionOptions(const QString& connOpts) - { -@@ -780,10 +788,7 @@ bool QODBCDriverPrivate::setConnectionOptions(const QString& connOpts) - v = val.toUInt(); - r = SQLSetConnectAttr(hDbc, SQL_ATTR_LOGIN_TIMEOUT, (SQLPOINTER) size_t(v), 0); - } else if (opt.toUpper() == "SQL_ATTR_CURRENT_CATALOG"_L1) { -- val.utf16(); // 0 terminate -- r = SQLSetConnectAttr(hDbc, SQL_ATTR_CURRENT_CATALOG, -- toSQLTCHAR(val).data(), -- SQLINTEGER(val.length() * sizeof(SQLTCHAR))); -+ r = qt_string_SQLSetConnectAttr(hDbc, SQL_ATTR_CURRENT_CATALOG, val); - } else if (opt.toUpper() == "SQL_ATTR_METADATA_ID"_L1) { - if (val.toUpper() == "SQL_TRUE"_L1) { - v = SQL_TRUE; -@@ -798,10 +803,7 @@ bool QODBCDriverPrivate::setConnectionOptions(const QString& connOpts) - v = val.toUInt(); - r = SQLSetConnectAttr(hDbc, SQL_ATTR_PACKET_SIZE, (SQLPOINTER) size_t(v), 0); - } else if (opt.toUpper() == "SQL_ATTR_TRACEFILE"_L1) { -- val.utf16(); // 0 terminate -- r = SQLSetConnectAttr(hDbc, SQL_ATTR_TRACEFILE, -- toSQLTCHAR(val).data(), -- SQLINTEGER(val.length() * sizeof(SQLTCHAR))); -+ r = qt_string_SQLSetConnectAttr(hDbc, SQL_ATTR_TRACEFILE, val); - } else if (opt.toUpper() == "SQL_ATTR_TRACE"_L1) { - if (val.toUpper() == "SQL_OPT_TRACE_OFF"_L1) { - v = SQL_OPT_TRACE_OFF; -@@ -1004,9 +1006,12 @@ bool QODBCResult::reset (const QString& query) - return false; - } - -- r = SQLExecDirect(d->hStmt, -- toSQLTCHAR(query).data(), -- (SQLINTEGER) query.length()); -+ { -+ auto encoded = toSQLTCHAR(query); -+ r = SQLExecDirect(d->hStmt, -+ encoded.data(), -+ SQLINTEGER(encoded.size())); -+ } - if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO && r!= SQL_NO_DATA) { - setLastError(qMakeError(QCoreApplication::translate("QODBCResult", - "Unable to execute statement"), QSqlError::StatementError, d)); -@@ -1355,9 +1360,12 @@ bool QODBCResult::prepare(const QString& query) - return false; - } - -- r = SQLPrepare(d->hStmt, -- toSQLTCHAR(query).data(), -- (SQLINTEGER) query.length()); -+ { -+ auto encoded = toSQLTCHAR(query); -+ r = SQLPrepare(d->hStmt, -+ encoded.data(), -+ SQLINTEGER(encoded.size())); -+ } - - if (r != SQL_SUCCESS) { - setLastError(qMakeError(QCoreApplication::translate("QODBCResult", -@@ -1385,7 +1393,7 @@ bool QODBCResult::exec() - SQLCloseCursor(d->hStmt); - - QVariantList &values = boundValues(); -- QByteArrayList tmpStorage(values.count(), QByteArray()); // holds temporary buffers -+ QByteArrayList tmpStorage(values.count(), QByteArray()); // targets for SQLBindParameter() - QVarLengthArray indicators(values.count()); - memset(indicators.data(), 0, indicators.size() * sizeof(SQLLEN)); - -@@ -1600,36 +1608,36 @@ bool QODBCResult::exec() - case QMetaType::QString: - if (d->unicode) { - QByteArray &ba = tmpStorage[i]; -- QString str = val.toString(); -+ { -+ const auto encoded = toSQLTCHAR(val.toString()); -+ ba = QByteArray(reinterpret_cast(encoded.data()), -+ encoded.size() * sizeof(SQLTCHAR)); -+ } -+ - if (*ind != SQL_NULL_DATA) -- *ind = str.length() * sizeof(SQLTCHAR); -- const qsizetype strSize = str.length() * sizeof(SQLTCHAR); -+ *ind = ba.size(); - - if (bindValueType(i) & QSql::Out) { -- const QVarLengthArray a(toSQLTCHAR(str)); -- ba = QByteArray((const char *)a.constData(), int(a.size() * sizeof(SQLTCHAR))); - r = SQLBindParameter(d->hStmt, - i + 1, - qParamType[bindValueType(i) & QSql::InOut], - SQL_C_TCHAR, -- strSize > 254 ? SQL_WLONGVARCHAR : SQL_WVARCHAR, -+ ba.size() > 254 ? SQL_WLONGVARCHAR : SQL_WVARCHAR, - 0, // god knows... don't change this! - 0, -- ba.data(), -+ const_cast(ba.constData()), // don't detach - ba.size(), - ind); - break; - } -- ba = QByteArray(reinterpret_cast(toSQLTCHAR(str).constData()), -- int(strSize)); - r = SQLBindParameter(d->hStmt, - i + 1, - qParamType[bindValueType(i) & QSql::InOut], - SQL_C_TCHAR, -- strSize > 254 ? SQL_WLONGVARCHAR : SQL_WVARCHAR, -- strSize, -+ ba.size() > 254 ? SQL_WLONGVARCHAR : SQL_WVARCHAR, -+ ba.size(), - 0, -- const_cast(ba.constData()), -+ const_cast(ba.constData()), // don't detach - ba.size(), - ind); - break; -@@ -1991,14 +1999,16 @@ bool QODBCDriver::open(const QString & db, - SQLSMALLINT cb; - QVarLengthArray connOut(1024); - memset(connOut.data(), 0, connOut.size() * sizeof(SQLTCHAR)); -- r = SQLDriverConnect(d->hDbc, -- NULL, -- toSQLTCHAR(connQStr).data(), -- (SQLSMALLINT)connQStr.length(), -- connOut.data(), -- 1024, -- &cb, -- /*SQL_DRIVER_NOPROMPT*/0); -+ { -+ auto encoded = toSQLTCHAR(connQStr); -+ r = SQLDriverConnect(d->hDbc, -+ nullptr, -+ encoded.data(), SQLSMALLINT(encoded.size()), -+ connOut.data(), -+ 1024, -+ &cb, -+ /*SQL_DRIVER_NOPROMPT*/0); -+ } - - if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO) { - setLastError(qMakeError(tr("Unable to connect"), QSqlError::ConnectionError, d)); -@@ -2377,17 +2387,15 @@ QStringList QODBCDriver::tables(QSql::TableType type) const - if (tableType.isEmpty()) - return tl; - -- QString joinedTableTypeString = tableType.join(u','); -+ { -+ auto joinedTableTypeString = toSQLTCHAR(tableType.join(u',')); - -- r = SQLTables(hStmt, -- NULL, -- 0, -- NULL, -- 0, -- NULL, -- 0, -- toSQLTCHAR(joinedTableTypeString).data(), -- joinedTableTypeString.length() /* characters, not bytes */); -+ r = SQLTables(hStmt, -+ nullptr, 0, -+ nullptr, 0, -+ nullptr, 0, -+ joinedTableTypeString.data(), joinedTableTypeString.size()); -+ } - - if (r != SQL_SUCCESS) - qSqlWarning("QODBCDriver::tables Unable to execute table list"_L1, d); -@@ -2460,28 +2468,30 @@ QSqlIndex QODBCDriver::primaryIndex(const QString& tablename) const - SQL_ATTR_CURSOR_TYPE, - (SQLPOINTER)SQL_CURSOR_FORWARD_ONLY, - SQL_IS_UINTEGER); -- r = SQLPrimaryKeys(hStmt, -- catalog.length() == 0 ? NULL : toSQLTCHAR(catalog).data(), -- catalog.length(), -- schema.length() == 0 ? NULL : toSQLTCHAR(schema).data(), -- schema.length(), -- toSQLTCHAR(table).data(), -- table.length() /* in characters, not in bytes */); -+ { -+ auto c = toSQLTCHAR(catalog); -+ auto s = toSQLTCHAR(schema); -+ auto t = toSQLTCHAR(table); -+ r = SQLPrimaryKeys(hStmt, -+ catalog.isEmpty() ? nullptr : c.data(), c.size(), -+ schema.isEmpty() ? nullptr : s.data(), s.size(), -+ t.data(), t.size()); -+ } - - // if the SQLPrimaryKeys() call does not succeed (e.g the driver - // does not support it) - try an alternative method to get hold of - // the primary index (e.g MS Access and FoxPro) - if (r != SQL_SUCCESS) { -- r = SQLSpecialColumns(hStmt, -- SQL_BEST_ROWID, -- catalog.length() == 0 ? NULL : toSQLTCHAR(catalog).data(), -- catalog.length(), -- schema.length() == 0 ? NULL : toSQLTCHAR(schema).data(), -- schema.length(), -- toSQLTCHAR(table).data(), -- table.length(), -- SQL_SCOPE_CURROW, -- SQL_NULLABLE); -+ auto c = toSQLTCHAR(catalog); -+ auto s = toSQLTCHAR(schema); -+ auto t = toSQLTCHAR(table); -+ r = SQLSpecialColumns(hStmt, -+ SQL_BEST_ROWID, -+ catalog.isEmpty() ? nullptr : c.data(), c.size(), -+ schema.isEmpty() ? nullptr : s.data(), s.size(), -+ t.data(), t.size(), -+ SQL_SCOPE_CURROW, -+ SQL_NULLABLE); - - if (r != SQL_SUCCESS) { - qSqlWarning("QODBCDriver::primaryIndex: Unable to execute primary key list"_L1, d); -@@ -2562,15 +2572,17 @@ QSqlRecord QODBCDriver::record(const QString& tablename) const - SQL_ATTR_CURSOR_TYPE, - (SQLPOINTER)SQL_CURSOR_FORWARD_ONLY, - SQL_IS_UINTEGER); -- r = SQLColumns(hStmt, -- catalog.length() == 0 ? NULL : toSQLTCHAR(catalog).data(), -- catalog.length(), -- schema.length() == 0 ? NULL : toSQLTCHAR(schema).data(), -- schema.length(), -- toSQLTCHAR(table).data(), -- table.length(), -- NULL, -- 0); -+ { -+ auto c = toSQLTCHAR(catalog); -+ auto s = toSQLTCHAR(schema); -+ auto t = toSQLTCHAR(table); -+ r = SQLColumns(hStmt, -+ catalog.isEmpty() ? nullptr : c.data(), c.size(), -+ schema.isEmpty() ? nullptr : s.data(), s.size(), -+ t.data(), t.size(), -+ nullptr, -+ 0); -+ } - if (r != SQL_SUCCESS) - qSqlWarning("QODBCDriver::record: Unable to execute column list"_L1, d); - diff --git a/qt6-base.changes b/qt6-base.changes index 96ff32b..8b094c2 100644 --- a/qt6-base.changes +++ b/qt6-base.changes @@ -1,3 +1,13 @@ +------------------------------------------------------------------- +Thu Mar 16 09:59:57 UTC 2023 - Christophe Marin + +- Update to 6.4.3: + * https://www.qt.io/blog/qt-6.4.3-released +- Drop patch, merged upstream: + * CVE-2023-24607-qtbase-6.4.diff +- Add patch to silence moc warnings: + * 0001-Avoid-resetting-CMAKE_AUTOMOC_MACRO_NAMES.patch + ------------------------------------------------------------------- Wed Feb 8 17:48:36 UTC 2023 - Christophe Marin diff --git a/qt6-base.spec b/qt6-base.spec index f90e839..609c866 100644 --- a/qt6-base.spec +++ b/qt6-base.spec @@ -16,7 +16,7 @@ # -%define real_version 6.4.2 +%define real_version 6.4.3 %define short_version 6.4 %define tar_name qtbase-everywhere-src %define tar_suffix %{nil} @@ -30,7 +30,7 @@ %global with_gles 1 %endif Name: qt6-base%{?pkg_suffix} -Version: 6.4.2 +Version: 6.4.3 Release: 0 Summary: Qt 6 core components (Core, Gui, Widgets, Network...) # Legal: qtpaths is BSD-3-Clause @@ -39,7 +39,7 @@ URL: https://www.qt.io Source: 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 # Patches 0-100 are upstream patches # -Patch0: CVE-2023-24607-qtbase-6.4.diff +Patch0: 0001-Avoid-resetting-CMAKE_AUTOMOC_MACRO_NAMES.patch # Patches 100-200 are openSUSE and/or non-upstream(able) patches # Patch100: 0001-Tell-the-truth-about-private-API.patch %if 0%{?suse_version} == 1500 @@ -809,30 +809,18 @@ rm %{buildroot}%{_qt6_libexecdir}/qt-testrunner.py # This is only for Apple platforms and has a python2 dep rm -r %{buildroot}%{_qt6_mkspecsdir}/features/uikit -%post -n libQt6Concurrent6 -p /sbin/ldconfig -%post -n libQt6Core6 -p /sbin/ldconfig -%post -n libQt6DBus6 -p /sbin/ldconfig -%post -n libQt6Gui6 -p /sbin/ldconfig -%post -n libQt6Network6 -p /sbin/ldconfig -%post -n libQt6OpenGL6 -p /sbin/ldconfig -%post -n libQt6OpenGLWidgets6 -p /sbin/ldconfig -%post -n libQt6PrintSupport6 -p /sbin/ldconfig -%post -n libQt6Sql6 -p /sbin/ldconfig -%post -n libQt6Test6 -p /sbin/ldconfig -%post -n libQt6Widgets6 -p /sbin/ldconfig -%post -n libQt6Xml6 -p /sbin/ldconfig -%postun -n libQt6Concurrent6 -p /sbin/ldconfig -%postun -n libQt6Core6 -p /sbin/ldconfig -%postun -n libQt6DBus6 -p /sbin/ldconfig -%postun -n libQt6Gui6 -p /sbin/ldconfig -%postun -n libQt6Network6 -p /sbin/ldconfig -%postun -n libQt6OpenGL6 -p /sbin/ldconfig -%postun -n libQt6OpenGLWidgets6 -p /sbin/ldconfig -%postun -n libQt6PrintSupport6 -p /sbin/ldconfig -%postun -n libQt6Sql6 -p /sbin/ldconfig -%postun -n libQt6Test6 -p /sbin/ldconfig -%postun -n libQt6Widgets6 -p /sbin/ldconfig -%postun -n libQt6Xml6 -p /sbin/ldconfig +%ldconfig_scriptlets -n libQt6Concurrent6 +%ldconfig_scriptlets -n libQt6Core6 +%ldconfig_scriptlets -n libQt6DBus6 +%ldconfig_scriptlets -n libQt6Gui6 +%ldconfig_scriptlets -n libQt6Network6 +%ldconfig_scriptlets -n libQt6OpenGL6 +%ldconfig_scriptlets -n libQt6OpenGLWidgets6 +%ldconfig_scriptlets -n libQt6PrintSupport6 +%ldconfig_scriptlets -n libQt6Sql6 +%ldconfig_scriptlets -n libQt6Test6 +%ldconfig_scriptlets -n libQt6Widgets6 +%ldconfig_scriptlets -n libQt6Xml6 %files devel %doc meta_package diff --git a/qtbase-everywhere-src-6.4.2.tar.xz b/qtbase-everywhere-src-6.4.2.tar.xz deleted file mode 100644 index d80426d..0000000 --- a/qtbase-everywhere-src-6.4.2.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a88bc6cedbb34878a49a622baa79cace78cfbad4f95fdbd3656ddb21c705525d -size 47987188 diff --git a/qtbase-everywhere-src-6.4.3.tar.xz b/qtbase-everywhere-src-6.4.3.tar.xz new file mode 100644 index 0000000..d389453 --- /dev/null +++ b/qtbase-everywhere-src-6.4.3.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5087c9e5b0165e7bc3c1a4ab176b35d0cd8f52636aea903fa377bdba00891a60 +size 48078536