This commit is contained in:
Jan Grulich 2020-11-20 09:29:10 +01:00
parent 6f0b990f87
commit 8525318401
2 changed files with 6 additions and 79 deletions

View File

@ -48,8 +48,8 @@ BuildRequires: pkgconfig(libsystemd)
Name: qt5-qtbase
Summary: Qt5 - QtBase components
Version: 5.15.1
Release: 7%{?dist}
Version: 5.15.2
Release: 1%{?dist}
# See LGPL_EXCEPTIONS.txt, for exception details
License: LGPLv2 with exceptions or GPLv3 with exceptions
@ -129,8 +129,6 @@ Patch90: %{name}-gcc11.patch
## upstream patches
Patch100: qtbase-emit-qscreen-geometry-changed-when-logical-dpi-changes.patch
Patch101: qtbase-QTBUG-86319.patch
# Do not check any files in %%{_qt5_plugindir}/platformthemes/ for requires.
# Those themes are there for platform integration. If the required libraries are
# not there, the platform to integrate with isn't either. Then Qt will just
@ -391,7 +389,6 @@ Qt5 libraries used for drawing widgets and OpenGL items.
## upstream patches
%patch100 -p1 -b .emit-qscreen-geometry-changed-when-logical-dpi-changes
%patch101 -p1
# move some bundled libs to ensure they're not accidentally used
pushd src/3rdparty
@ -536,7 +533,7 @@ translationdir=%{_qt5_translationdir}
Name: Qt5
Description: Qt5 Configuration
Version: 5.15.1
Version: 5.15.2
EOF
# rpm macros
@ -1049,6 +1046,9 @@ fi
%changelog
* Fri Nov 20 09:27:41 CET 2020 Jan Grulich <jgrulich@redhat.com> - 5.15.2-1
- 5.15.2
* Tue Nov 03 2020 Sandro Mani <manisandro@gmail.com> - 5.15.1-7
- Backport upstream fix for QTBUG-86319

View File

@ -1,73 +0,0 @@
From a82032351c921c3d5d57122aca57b47f83f9b9d1 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@intel.com>
Date: Thu, 10 Sep 2020 13:30:59 -0700
Subject: [PATCH] forkfd/Linux: ask clone() to use the SIGCHLD as the
termination signal
Because of these lines in the Linux kernel (kernel/fork.c, see [1][3]):
if (clone_flags & CLONE_VFORK)
trace = PTRACE_EVENT_VFORK;
else if (args->exit_signal != SIGCHLD)
trace = PTRACE_EVENT_CLONE;
else
trace = PTRACE_EVENT_FORK;
Without CLONE_VFORK (which we can't use), if the exit signal isn't
SIGCHLD, the debugger will get a PTRACE_EVENT_CLONE, which makes it
think the process we're starting is a thread, not a new process. Both
gdb and lldb remain attached to the child and when it later performs an
execve(), they get mightily confused. See gdb bug report[5].
The idea of not having an exit_signal was so that no SIGCHLD would be
delivered to the parent process in the first place. That way, some
misguided SIGCHLD handler (*cough* GLib *cough*) wouldn't reap our
processes. Unfortunately, what I didn't realize was that the kernel
sends SIGCHLD anyway (see [2][4]), so this defensive measure didn't
actually work. Consequently, we can pass SIGCHLD to clone() and get the
debuggers working again.
[ChangeLog][Linux] Fixed an issue that would cause debugging a Qt
application that uses QProcess to confuse both gdb and lldb if
the Linux kernel was version 5.4 or higher. Behavior outside of
a debugging session was not affected.
[1] https://code.woboq.org/linux/linux/kernel/fork.c.html#_do_fork
[2] https://code.woboq.org/linux/linux/kernel/signal.c.html#do_notify_parent
[3] https://elixir.bootlin.com/linux/v5.8/source/kernel/fork.c#L2432
[4] https://elixir.bootlin.com/linux/v5.8/source/kernel/signal.c#L1925
[5] https://sourceware.org/bugzilla/show_bug.cgi?id=26562
Fixes: QTBUG-86319
Change-Id: I2fc68c725ba649218bd9fffd1633863613537d42
Reviewed-by: Dimitrios Apostolou <jimis@qt.io>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Reviewed-by: hjk <hjk@qt.io>
(cherry picked from commit d1fc991c6e3c45a5f93c925d49e3fe77ce6ce455)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
src/3rdparty/forkfd/forkfd_linux.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/3rdparty/forkfd/forkfd_linux.c b/src/3rdparty/forkfd/forkfd_linux.c
index 523fbca3ccc..ffe0e9a5e24 100644
--- a/src/3rdparty/forkfd/forkfd_linux.c
+++ b/src/3rdparty/forkfd/forkfd_linux.c
@@ -147,7 +147,7 @@ int system_forkfd(int flags, pid_t *ppid, int *system)
}
*system = 1;
- unsigned long cloneflags = CLONE_PIDFD;
+ unsigned long cloneflags = CLONE_PIDFD | SIGCHLD;
pid = sys_clone(cloneflags, &pidfd);
if (ppid)
*ppid = pid;
@@ -171,7 +171,7 @@ int system_forkfd_wait(int ffd, struct forkfd_info *info, int ffdoptions, struct
{
siginfo_t si;
int ret;
- int options = __WALL | convertForkfdWaitFlagsToWaitFlags(ffdoptions);
+ int options = convertForkfdWaitFlagsToWaitFlags(ffdoptions);
if ((options & WNOHANG) == 0) {
/* check if the file descriptor is non-blocking */