summaryrefslogtreecommitdiff
path: root/dev-qt/qtcore/files
diff options
context:
space:
mode:
authorV3n3RiX <venerix@redcorelinux.org>2020-11-25 22:39:15 +0000
committerV3n3RiX <venerix@redcorelinux.org>2020-11-25 22:39:15 +0000
commitd934827bf44b7cfcf6711964418148fa60877668 (patch)
tree0625f358789b5e015e49db139cc1dbc9be00428f /dev-qt/qtcore/files
parent2e34d110f164bf74d55fced27fe0000201b3eec5 (diff)
gentoo resync : 25.11.2020
Diffstat (limited to 'dev-qt/qtcore/files')
-rw-r--r--dev-qt/qtcore/files/qtcore-5.14.2-QLibrary-deadlock.patch106
-rw-r--r--dev-qt/qtcore/files/qtcore-5.15.1-timezone-1.patch271
-rw-r--r--dev-qt/qtcore/files/qtcore-5.15.1-timezone-2.patch47
3 files changed, 318 insertions, 106 deletions
diff --git a/dev-qt/qtcore/files/qtcore-5.14.2-QLibrary-deadlock.patch b/dev-qt/qtcore/files/qtcore-5.14.2-QLibrary-deadlock.patch
deleted file mode 100644
index 6a9c9921b7d0..000000000000
--- a/dev-qt/qtcore/files/qtcore-5.14.2-QLibrary-deadlock.patch
+++ /dev/null
@@ -1,106 +0,0 @@
-From 276fa8383a7535765be7182883ef4aade17ce013 Mon Sep 17 00:00:00 2001
-From: Thiago Macieira <thiago.macieira@intel.com>
-Date: Thu, 2 Apr 2020 12:08:41 -0300
-Subject: [PATCH] QLibrary: fix deadlock caused by fix to QTBUG-39642
-
-Commit ae6f73e8566fa76470937aca737141183929a5ec inserted a mutex around
-the entire load_sys(). We had reasoed that deadlocks would only occur if
-the object creation in instance() recursed into its own instance(),
-which was already a bug. But we had forgotten that dlopen()/
-LoadLibrary() executes initialization code from the module being loaded,
-which could cause a recursion back into the same QPluginLoader or
-QLibrary object. This recursion is benign because the module *is* loaded
-and dlopen()/LoadLibrary() returns the same handle.
-
-[ChangeLog][QtCore][QLibrary and QPluginLoader] Fixed a deadlock that
-would happen if the plugin or library being loaded has load-time
-initialization code (C++ global variables) that recursed back into the
-same QLibrary or QPluginLoader object.
-
-PS: QLibraryPrivate::loadPlugin() updates pluginState outside a mutex
-lock, so pluginState should be made an atomic variable. Once that is
-done, we'll only need locking the mutex to update errorString (no
-locking before loading).
-
-Fixes: QTBUG-83207
-Task-number: QTBUG-39642
-Change-Id: Ibdc95e9af7bd456a94ecfffd160209304e5ab2eb
-Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
-Reviewed-by: David Faure <david.faure@kdab.com>
----
- src/corelib/plugin/qlibrary.cpp | 2 --
- src/corelib/plugin/qlibrary_unix.cpp | 4 ++++
- src/corelib/plugin/qlibrary_win.cpp | 3 +++
- 3 files changed, 7 insertions(+), 2 deletions(-)
-
-diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp
-index ddb053c26fa..be9d92b2048 100644
---- a/src/corelib/plugin/qlibrary.cpp
-+++ b/src/corelib/plugin/qlibrary.cpp
-@@ -576,9 +576,7 @@ bool QLibraryPrivate::load()
-
- Q_TRACE(QLibraryPrivate_load_entry, fileName);
-
-- mutex.lock();
- bool ret = load_sys();
-- mutex.unlock();
- if (qt_debug_component()) {
- if (ret) {
- qDebug() << "loaded library" << fileName;
-diff --git a/src/corelib/plugin/qlibrary_unix.cpp b/src/corelib/plugin/qlibrary_unix.cpp
-index 017aa97b66a..a5c72f81d96 100644
---- a/src/corelib/plugin/qlibrary_unix.cpp
-+++ b/src/corelib/plugin/qlibrary_unix.cpp
-@@ -123,6 +123,7 @@ QStringList QLibraryPrivate::prefixes_sys()
-
- bool QLibraryPrivate::load_sys()
- {
-+ QMutexLocker locker(&mutex);
- QString attempt;
- QFileSystemEntry fsEntry(fileName);
-
-@@ -213,6 +214,7 @@ bool QLibraryPrivate::load_sys()
- }
- #endif
-
-+ locker.unlock();
- bool retry = true;
- Handle hnd = nullptr;
- for (int prefix = 0; retry && !hnd && prefix < prefixes.size(); prefix++) {
-@@ -273,6 +275,8 @@ bool QLibraryPrivate::load_sys()
- }
- }
- #endif
-+
-+ locker.relock();
- if (!hnd) {
- errorString = QLibrary::tr("Cannot load library %1: %2").arg(fileName, qdlerror());
- }
-diff --git a/src/corelib/plugin/qlibrary_win.cpp b/src/corelib/plugin/qlibrary_win.cpp
-index 000bf762763..ef58724be8e 100644
---- a/src/corelib/plugin/qlibrary_win.cpp
-+++ b/src/corelib/plugin/qlibrary_win.cpp
-@@ -78,6 +78,7 @@ bool QLibraryPrivate::load_sys()
- // fileName
- //
- // NB If it's a plugin we do not ever try the ".dll" extension
-+ QMutexLocker locker(&mutex);
- QStringList attempts;
-
- if (pluginState != IsAPlugin)
-@@ -95,6 +96,7 @@ bool QLibraryPrivate::load_sys()
- attempts.prepend(QDir::rootPath() + fileName);
- #endif
-
-+ locker.unlock();
- Handle hnd = nullptr;
- for (const QString &attempt : qAsConst(attempts)) {
- #ifndef Q_OS_WINRT
-@@ -115,6 +117,7 @@ bool QLibraryPrivate::load_sys()
- #ifndef Q_OS_WINRT
- SetErrorMode(oldmode);
- #endif
-+ locker.relock();
- if (!hnd) {
- errorString = QLibrary::tr("Cannot load library %1: %2").arg(
- QDir::toNativeSeparators(fileName), qt_error_string());
diff --git a/dev-qt/qtcore/files/qtcore-5.15.1-timezone-1.patch b/dev-qt/qtcore/files/qtcore-5.15.1-timezone-1.patch
new file mode 100644
index 000000000000..1c8f1e89e7d5
--- /dev/null
+++ b/dev-qt/qtcore/files/qtcore-5.15.1-timezone-1.patch
@@ -0,0 +1,271 @@
+From c337f6fae51b987ce7dbed1fd9bea41e6073efbb Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfridge@gentoo.org>
+Date: Sat, 10 Oct 2020 19:26:13 +0200
+Subject: [PATCH 1/2] Revert "Cache system zone ID when fetched from the
+ file-system"
+
+This reverts commit c70ce3d042025c858faffe661f85d2482a2a0d8c.
+---
+ src/corelib/time/qtimezoneprivate_tz.cpp | 205 +++++++----------------
+ 1 file changed, 64 insertions(+), 141 deletions(-)
+
+diff --git a/src/corelib/time/qtimezoneprivate_tz.cpp b/src/corelib/time/qtimezoneprivate_tz.cpp
+index c5c70b7364..01f9a6cce0 100644
+--- a/src/corelib/time/qtimezoneprivate_tz.cpp
++++ b/src/corelib/time/qtimezoneprivate_tz.cpp
+@@ -1,6 +1,5 @@
+ /****************************************************************************
+ **
+-** Copyright (C) 2020 The Qt Company Ltd.
+ ** Copyright (C) 2019 Crimson AS <info@crimson.no>
+ ** Copyright (C) 2013 John Layt <jlayt@kde.org>
+ ** Contact: https://www.qt.io/licensing/
+@@ -43,19 +42,18 @@
+ #include "qtimezoneprivate_p.h"
+ #include "private/qlocale_tools_p.h"
+
+-#include <QtCore/QDataStream>
+-#include <QtCore/QDateTime>
+ #include <QtCore/QFile>
+-#include <QtCore/QHash>
+ #include <QtCore/QMutex>
++#include <QtCore/QHash>
++#include <QtCore/QDataStream>
++#include <QtCore/QDateTime>
+
+ #include <qdebug.h>
+-#include <qplatformdefs.h>
+
+ #include <algorithm>
+ #include <errno.h>
+ #include <limits.h>
+-#ifndef Q_OS_INTEGRITY
++#if !defined(Q_OS_INTEGRITY)
+ #include <sys/param.h> // to use MAXSYMLINKS constant
+ #endif
+ #include <unistd.h> // to use _SC_SYMLOOP_MAX constant
+@@ -1102,146 +1100,28 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::previousTransition(qint64 beforeMSecs
+ return last > tranCache().cbegin() ? dataForTzTransition(*--last) : invalidData();
+ }
+
+-bool QTzTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const
+-{
+- return tzZones->contains(ianaId);
+-}
+-
+-QList<QByteArray> QTzTimeZonePrivate::availableTimeZoneIds() const
+-{
+- QList<QByteArray> result = tzZones->keys();
+- std::sort(result.begin(), result.end());
+- return result;
+-}
+-
+-QList<QByteArray> QTzTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const
++static long getSymloopMax()
+ {
+- // TODO AnyCountry
+- QList<QByteArray> result;
+- for (auto it = tzZones->cbegin(), end = tzZones->cend(); it != end; ++it) {
+- if (it.value().country == country)
+- result << it.key();
+- }
+- std::sort(result.begin(), result.end());
+- return result;
+-}
+-
+-// Getting the system zone's ID:
+-
+-namespace {
+-class ZoneNameReader : public QObject
+-{
+-public:
+- QByteArray name()
+- {
+- /* Assumptions:
+- a) Systems don't change which of localtime and TZ they use without a
+- reboot.
+- b) When they change, they use atomic renames, hence a new device and
+- inode for the new file.
+- c) If we change which *name* is used for a zone, while referencing
+- the same final zoneinfo file, we don't care about the change of
+- name (e.g. if Europe/Oslo and Europe/Berlin are both symlinks to
+- the same CET file, continuing to use the old name, after
+- /etc/localtime changes which of the two it points to, is
+- harmless).
+-
+- The alternative would be to use a file-system watcher, but they are a
+- scarce resource.
+- */
+- const StatIdent local = identify("/etc/localtime");
+- const StatIdent tz = identify("/etc/TZ");
+- if (!m_name.isEmpty() && m_last.isValid() && (m_last == local || m_last == tz))
+- return m_name;
+-
+- m_name = etcLocalTime();
+- if (!m_name.isEmpty()) {
+- m_last = local;
+- return m_name;
+- }
+-
+- m_name = etcTZ();
+- m_last = m_name.isEmpty() ? StatIdent() : tz;
+- return m_name;
+- }
+-
+-
+-private:
+- QByteArray m_name;
+- struct StatIdent
+- {
+- static constexpr unsigned long bad = ~0ul;
+- unsigned long m_dev, m_ino;
+- StatIdent() : m_dev(bad), m_ino(bad) {}
+- StatIdent(const QT_STATBUF &data) : m_dev(data.st_dev), m_ino(data.st_ino) {}
+- bool isValid() { return m_dev != bad || m_ino != bad; }
+- bool operator==(const StatIdent &other)
+- { return other.m_dev == m_dev && other.m_ino == m_ino; }
+- };
+- StatIdent m_last;
+-
+- static StatIdent identify(const char *path)
+- {
+- QT_STATBUF data;
+- return QT_STAT(path, &data) == -1 ? StatIdent() : StatIdent(data);
+- }
+-
+- static QByteArray etcLocalTime()
+- {
+- // On most distros /etc/localtime is a symlink to a real file so extract
+- // name from the path
+- const QLatin1String zoneinfo("/zoneinfo/");
+- QString path = QStringLiteral("/etc/localtime");
+- long iteration = getSymloopMax();
+- // Symlink may point to another symlink etc. before being under zoneinfo/
+- // We stop on the first path under /zoneinfo/, even if it is itself a
+- // symlink, like America/Montreal pointing to America/Toronto
+- do {
+- path = QFile::symLinkTarget(path);
+- int index = path.indexOf(zoneinfo);
+- if (index >= 0) // Found zoneinfo file; extract zone name from path:
+- return path.midRef(index + zoneinfo.size()).toUtf8();
+- } while (!path.isEmpty() && --iteration > 0);
+-
+- return QByteArray();
+- }
+-
+- static QByteArray etcTZ()
+- {
+- // Some systems (e.g. uClibc) have a default value for $TZ in /etc/TZ:
+- const QString path = QStringLiteral("/etc/TZ");
+- QFile zone(path);
+- if (zone.open(QIODevice::ReadOnly))
+- return zone.readAll().trimmed();
+-
+- return QByteArray();
+- }
+-
+- // Any chain of symlinks longer than this is assumed to be a loop:
+- static long getSymloopMax()
+- {
+-#ifdef SYMLOOP_MAX
+- // If defined, at runtime it can only be greater than this, so this is a safe bet:
+- return SYMLOOP_MAX;
++#if defined(SYMLOOP_MAX)
++ return SYMLOOP_MAX; // if defined, at runtime it can only be greater than this, so this is a safe bet
+ #else
+- errno = 0;
+- long result = sysconf(_SC_SYMLOOP_MAX);
+- if (result >= 0)
+- return result;
+- // result is -1, meaning either error or no limit
+- Q_ASSERT(!errno); // ... but it can't be an error, POSIX mandates _SC_SYMLOOP_MAX
+-
+- // therefore we can make up our own limit
+-# ifdef MAXSYMLINKS
+- return MAXSYMLINKS;
++ errno = 0;
++ long result = sysconf(_SC_SYMLOOP_MAX);
++ if (result >= 0)
++ return result;
++ // result is -1, meaning either error or no limit
++ Q_ASSERT(!errno); // ... but it can't be an error, POSIX mandates _SC_SYMLOOP_MAX
++
++ // therefore we can make up our own limit
++# if defined(MAXSYMLINKS)
++ return MAXSYMLINKS;
+ # else
+- return 8;
++ return 8;
+ # endif
+ #endif
+- }
+-};
+ }
+
++// TODO Could cache the value and monitor the required files for any changes
+ QByteArray QTzTimeZonePrivate::systemTimeZoneId() const
+ {
+ // Check TZ env var first, if not populated try find it
+@@ -1256,9 +1136,28 @@ QByteArray QTzTimeZonePrivate::systemTimeZoneId() const
+ else if (ianaId.startsWith(':'))
+ ianaId = ianaId.mid(1);
+
++ // On most distros /etc/localtime is a symlink to a real file so extract name from the path
++ if (ianaId.isEmpty()) {
++ const QLatin1String zoneinfo("/zoneinfo/");
++ QString path = QFile::symLinkTarget(QStringLiteral("/etc/localtime"));
++ int index = -1;
++ long iteration = getSymloopMax();
++ // Symlink may point to another symlink etc. before being under zoneinfo/
++ // We stop on the first path under /zoneinfo/, even if it is itself a
++ // symlink, like America/Montreal pointing to America/Toronto
++ while (iteration-- > 0 && !path.isEmpty() && (index = path.indexOf(zoneinfo)) < 0)
++ path = QFile::symLinkTarget(path);
++ if (index >= 0) {
++ // /etc/localtime is a symlink to the current TZ file, so extract from path
++ ianaId = path.midRef(index + zoneinfo.size()).toUtf8();
++ }
++ }
++
++ // Some systems (e.g. uClibc) have a default value for $TZ in /etc/TZ:
+ if (ianaId.isEmpty()) {
+- thread_local static ZoneNameReader reader;
+- ianaId = reader.name();
++ QFile zone(QStringLiteral("/etc/TZ"));
++ if (zone.open(QIODevice::ReadOnly))
++ ianaId = zone.readAll().trimmed();
+ }
+
+ // Give up for now and return UTC
+@@ -1268,4 +1167,28 @@ QByteArray QTzTimeZonePrivate::systemTimeZoneId() const
+ return ianaId;
+ }
+
++bool QTzTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const
++{
++ return tzZones->contains(ianaId);
++}
++
++QList<QByteArray> QTzTimeZonePrivate::availableTimeZoneIds() const
++{
++ QList<QByteArray> result = tzZones->keys();
++ std::sort(result.begin(), result.end());
++ return result;
++}
++
++QList<QByteArray> QTzTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const
++{
++ // TODO AnyCountry
++ QList<QByteArray> result;
++ for (auto it = tzZones->cbegin(), end = tzZones->cend(); it != end; ++it) {
++ if (it.value().country == country)
++ result << it.key();
++ }
++ std::sort(result.begin(), result.end());
++ return result;
++}
++
+ QT_END_NAMESPACE
+--
+2.28.0
+
diff --git a/dev-qt/qtcore/files/qtcore-5.15.1-timezone-2.patch b/dev-qt/qtcore/files/qtcore-5.15.1-timezone-2.patch
new file mode 100644
index 000000000000..611c979a469c
--- /dev/null
+++ b/dev-qt/qtcore/files/qtcore-5.15.1-timezone-2.patch
@@ -0,0 +1,47 @@
+From ffc9093a199a542791920b30d1835c3248920aa0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfridge@gentoo.org>
+Date: Sat, 10 Oct 2020 19:26:35 +0200
+Subject: [PATCH 2/2] Revert "Purge two old time-zone lookup fallbacks"
+
+This reverts commit b0383cbd388336f698ceeac11a4f50cdff931dd9.
+---
+ src/corelib/time/qtimezoneprivate_tz.cpp | 23 +++++++++++++++++++++++
+ 1 file changed, 23 insertions(+)
+
+diff --git a/src/corelib/time/qtimezoneprivate_tz.cpp b/src/corelib/time/qtimezoneprivate_tz.cpp
+index 01f9a6cce0..eea6f5e962 100644
+--- a/src/corelib/time/qtimezoneprivate_tz.cpp
++++ b/src/corelib/time/qtimezoneprivate_tz.cpp
+@@ -1153,6 +1153,29 @@ QByteArray QTzTimeZonePrivate::systemTimeZoneId() const
+ }
+ }
+
++ // On Debian Etch up to Jessie, /etc/localtime is a copy of the relevant
++ // zoneinfo file, whose name is recorded in /etc/timezone:
++ if (ianaId.isEmpty()) {
++ QFile tzif(QStringLiteral("/etc/timezone"));
++ if (tzif.open(QIODevice::ReadOnly))
++ ianaId = tzif.readAll().trimmed();
++ }
++
++ // On some Red Hat distros /etc/localtime is real file with name held in /etc/sysconfig/clock
++ // in a line like ZONE="Europe/Oslo" or TIMEZONE="Europe/Oslo"
++ if (ianaId.isEmpty()) {
++ QFile tzif(QStringLiteral("/etc/sysconfig/clock"));
++ if (tzif.open(QIODevice::ReadOnly)) {
++ while (ianaId.isEmpty() && !tzif.atEnd()) {
++ const QByteArray line(tzif.readLine().trimmed());
++ if (line.startsWith("ZONE="))
++ ianaId = line.mid(6, line.length() - 7);
++ else if (line.startsWith("TIMEZONE="))
++ ianaId = line.mid(10, line.length() - 11);
++ }
++ }
++ }
++
+ // Some systems (e.g. uClibc) have a default value for $TZ in /etc/TZ:
+ if (ianaId.isEmpty()) {
+ QFile zone(QStringLiteral("/etc/TZ"));
+--
+2.28.0
+