summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorSlávek Banko <slavek.banko@axis.cz>2025-11-22 01:50:40 +0100
committerSlávek Banko <slavek.banko@axis.cz>2025-11-22 01:50:40 +0100
commit683ca8e1ecd848518d65733cc938ecf9dc4054ce (patch)
tree5e5c2c6e83d6d23ce0f21b8eddb0040f604a0d2e /arch
parentd19abff43426147a521ba5739538cc1a59565a04 (diff)
downloadtde-packaging-683ca8e1ecd848518d65733cc938ecf9dc4054ce.tar.gz
tde-packaging-683ca8e1ecd848518d65733cc938ecf9dc4054ce.zip
ArchLinux tdelibs: Backport commit 884aff9885.
Make 'TDEConfigINIBackEnd::parseSingleConfigFile' reentrant. This resolves issue #379. Signed-off-by: Slávek Banko <slavek.banko@axis.cz>
Diffstat (limited to 'arch')
-rw-r--r--arch/tde-core/tde-tdelibs/PKGBUILD14
-rw-r--r--arch/tde-core/tde-tdelibs/bp000-reentrant-parseSingleConfigFile.diff126
2 files changed, 137 insertions, 3 deletions
diff --git a/arch/tde-core/tde-tdelibs/PKGBUILD b/arch/tde-core/tde-tdelibs/PKGBUILD
index 49dfc05b6..34950fafc 100644
--- a/arch/tde-core/tde-tdelibs/PKGBUILD
+++ b/arch/tde-core/tde-tdelibs/PKGBUILD
@@ -9,7 +9,7 @@ _kdemod="${_mod/tde/kde}"
pkgname="tde-${_mod}"
pkgver=14.1.5
-pkgrel=1
+pkgrel=2
pkgdesc="Trinity Desktop core libraries and applications"
arch=('i686' 'x86_64' 'aarch64' 'armv7h' 'powerpc64le')
url="https://scm.trinitydesktop.org/scm/git/${_mod}"
@@ -48,13 +48,21 @@ provides=("${_mod}")
conflicts=("trinity-${_kdemod}" "trinity-${_mod}" "kdemod3-${_kdemod}" "${_kdemod}3")
replaces=("trinity-${_kdemod}" "trinity-${_mod}")
options=('staticlibs' 'libtool' '!makeflags' '!strip')
-source=("https://mirror.ppa.trinitydesktop.org/trinity/releases/R${pkgver}/main/${_cat}${_mod}-trinity-${pkgver}.tar.xz")
-md5sums=('7c30955801381ec855f3b75ed5d7f527')
+source=("https://mirror.ppa.trinitydesktop.org/trinity/releases/R${pkgver}/main/${_cat}${_mod}-trinity-${pkgver}.tar.xz"
+ 'bp000-reentrant-parseSingleConfigFile.diff')
+md5sums=('7c30955801381ec855f3b75ed5d7f527'
+ 'e2ac1ade412c4a321f4ed013be0f3f13')
install="trinity-${_mod}.install"
[ -n "$TDEDIR" ] || TDEDIR=/opt/trinity
+prepare() {
+ msg "Apply backported patches"
+ cd ${srcdir}/${pkgname#*-}-trinity-${pkgver} || exit 1
+ patch -p1 < ${srcdir}/bp000-reentrant-parseSingleConfigFile.diff
+}
+
build() {
msg "Creating out-of-source build directory: ${srcdir}/build"
mkdir -p ${srcdir}/build
diff --git a/arch/tde-core/tde-tdelibs/bp000-reentrant-parseSingleConfigFile.diff b/arch/tde-core/tde-tdelibs/bp000-reentrant-parseSingleConfigFile.diff
new file mode 100644
index 000000000..85b93c741
--- /dev/null
+++ b/arch/tde-core/tde-tdelibs/bp000-reentrant-parseSingleConfigFile.diff
@@ -0,0 +1,126 @@
+commit 884aff988556c5271eb829768b17d27052a08763
+Author: Michele Calgaro <michele.calgaro@yahoo.it>
+Date: Tue Nov 18 23:03:25 2025 +0900
+
+ Make 'TDEConfigINIBackEnd::parseSingleConfigFile' reentrant.
+
+ If a second call to 'TDEConfigINIBackEnd::parseSingleConfigFile' was called from
+ another thread while the first wasn't finished, it would have resulted
+ in a SEGV fault. Config files are usually small and mmap-ing files
+ does not provide meaningful benefits while instead introducing the
+ possibility of a SIGBUS fault, although extremely unlukely in real
+ life.
+
+ This resolves issue #379.
+
+ Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
+
+diff --git a/tdecore/tdeconfigbackend.cpp b/tdecore/tdeconfigbackend.cpp
+index 707f4fe69..c7944ed12 100644
+--- a/tdecore/tdeconfigbackend.cpp
++++ b/tdecore/tdeconfigbackend.cpp
+@@ -431,80 +431,23 @@ bool TDEConfigINIBackEnd::parseConfigFiles()
+ return true;
+ }
+
+-#ifdef HAVE_MMAP
+-#ifdef SIGBUS
+-static sigjmp_buf mmap_jmpbuf;
+-struct sigaction mmap_old_sigact;
+-
+-extern "C" {
+- static void mmap_sigbus_handler(int)
+- {
+- siglongjmp (mmap_jmpbuf, 1);
+- }
+-}
+-#endif
+-#endif
+-
+ extern bool kde_kiosk_exception;
+
+ void TDEConfigINIBackEnd::parseSingleConfigFile(TQFile &rFile,
+ KEntryMap *pWriteBackMap,
+ bool bGlobal, bool bDefault)
+ {
+- const char *s; // May get clobbered by sigsetjump, but we don't use them afterwards.
+- const char *eof; // May get clobbered by sigsetjump, but we don't use them afterwards.
+- TQByteArray data;
+-
+ if (!rFile.isOpen()) // come back, if you have real work for us ;->
+ return;
+
+- //using kdDebug() here leads to an infinite loop
+- //remove this for the release, aleXXX
+- //tqWarning("Parsing %s, global = %s default = %s",
+- // rFile.name().latin1(), bGlobal ? "true" : "false", bDefault ? "true" : "false");
+-
+ TQCString aCurrentGroup("<default>");
+
+ unsigned int ll = localeString.length();
+
+-#ifdef HAVE_MMAP
+- static volatile const char *map;
+- map = ( const char* ) mmap(0, rFile.size(), PROT_READ, MAP_PRIVATE,
+- rFile.handle(), 0);
+-
+- if ( map != MAP_FAILED )
+- {
+- s = (const char*) map;
+- eof = s + rFile.size();
+-
+-#ifdef SIGBUS
+- struct sigaction act;
+- act.sa_handler = mmap_sigbus_handler;
+- sigemptyset( &act.sa_mask );
+-#ifdef SA_ONESHOT
+- act.sa_flags = SA_ONESHOT;
+-#else
+- act.sa_flags = SA_RESETHAND;
+-#endif
+- sigaction( SIGBUS, &act, &mmap_old_sigact );
+-
+- if (sigsetjmp (mmap_jmpbuf, 1))
+- {
+-tqWarning("SIGBUS while reading %s", rFile.name().latin1());
+- munmap(( char* )map, rFile.size());
+- sigaction (SIGBUS, &mmap_old_sigact, 0);
+- return;
+- }
+-#endif
+- }
+- else
+-#endif
+- {
+- rFile.at(0);
+- data = rFile.readAll();
+- s = data.data();
+- eof = s + data.size();
+- }
++ rFile.at(0);
++ TQByteArray data = rFile.readAll();
++ const char *s = data.data();
++ const char *eof = s + data.size();
+
+ bool fileOptionImmutable = false;
+ bool groupOptionImmutable = false;
+@@ -757,19 +700,8 @@ tqWarning("SIGBUS while reading %s", rFile.name().latin1());
+ }
+ }
+
+-
+ if (fileOptionImmutable)
+ bFileImmutable = true;
+-
+-#ifdef HAVE_MMAP
+- if (map)
+- {
+- munmap(( char* )map, rFile.size());
+-#ifdef SIGBUS
+- sigaction (SIGBUS, &mmap_old_sigact, 0);
+-#endif
+- }
+-#endif
+ }
+
+ void TDEConfigINIBackEnd::translateKey(TDELocale& locale, TQCString currentGroup, TQCString key) {