diff options
| author | Slávek Banko <slavek.banko@axis.cz> | 2025-11-22 01:50:40 +0100 |
|---|---|---|
| committer | Slávek Banko <slavek.banko@axis.cz> | 2025-11-22 01:50:40 +0100 |
| commit | 683ca8e1ecd848518d65733cc938ecf9dc4054ce (patch) | |
| tree | 5e5c2c6e83d6d23ce0f21b8eddb0040f604a0d2e /arch | |
| parent | d19abff43426147a521ba5739538cc1a59565a04 (diff) | |
| download | tde-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/PKGBUILD | 14 | ||||
| -rw-r--r-- | arch/tde-core/tde-tdelibs/bp000-reentrant-parseSingleConfigFile.diff | 126 |
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) { |
