https://bugs.kde.org/show_bug.cgi?id=384316

            Bug ID: 384316
           Summary: Crash on SIGTERM related to threading issues
           Product: ksmserver
           Version: 5.8.7
          Platform: Other
                OS: Linux
            Status: UNCONFIRMED
          Severity: normal
          Priority: NOR
         Component: general
          Assignee: l.lu...@kde.org
          Reporter: jpale...@web.de
  Target Milestone: ---

Created attachment 107666
  --> https://bugs.kde.org/attachment.cgi?id=107666&action=edit
Proposed patch

Hello

I got an odd crash from ksmserver with this backtrace:

Core was generated by `/usr/bin/ksmserver'.
#0  0xb770dcf9 in __kernel_vsyscall ()
[Current thread is 1 (Thread 0xaf2bfb40 (LWP 2170))]
(gdb) bt
#0  0xb770dcf9 in __kernel_vsyscall ()
#1  0xb758308f in waitpid () at ../sysdeps/unix/syscall-template.S:84
#2  0xb49b0b6e in ?? () from /usr/lib/i386-linux-gnu/libKF5Crash.so.5
#3  0xb49b1860 in KCrash::defaultCrashHandler(int) () from
/usr/lib/i386-linux-gnu/libKF5Crash.so.5
#4  <signal handler called>
#5  0xb770dcf9 in __kernel_vsyscall ()
#6  0xb74fddc0 in __libc_signal_restore_set (set=0xaf2be080) at
../sysdeps/unix/sysv/linux/nptl-signals.h:79
#7  __GI_raise (sig=6) at ../sysdeps/unix/sysv/linux/raise.c:48
#8  0xb74ff287 in __GI_abort () at abort.c:89
#9  0xb4d100d3 in qt_message_fatal (context=..., message=<synthetic
pointer>...) at global/qlogging.cpp:1682
#10 QMessageLogger::fatal (this=0xaf2be338, msg=0xb4f94f40 "ASSERT failure in
%s: \"%s\", file %s, line %d") at global/qlogging.cpp:793
#11 0xb4d0b06a in qt_assert_x (where=0xb504aced "QCoreApplication::sendEvent",
what=0xae902e38 "Cannot send events to objects owned by a different thread.
Current thread 804b9708. Receiver '' (of type 'QProcess') was created in thread
804869f8",
    file=0xb504ac98 "kernel/qcoreapplication.cpp", line=541) at
global/qglobal.cpp:3089
#12 0xb4edd18a in QCoreApplicationPrivate::checkReceiverThread
(receiver=<optimized out>) at kernel/qcoreapplication.cpp:533
#13 0xb582d1f2 in QApplication::notify(QObject*, QEvent*) () from
/usr/lib/i386-linux-gnu/libQt5Widgets.so.5
#14 0xb4eddab2 in QCoreApplication::notifyInternal2 (receiver=0x80505a38,
event=0xaf2be6e8) at kernel/qcoreapplication.cpp:988
#15 0xb4f15644 in QCoreApplication::sendEvent (event=0xaf2be6e8,
receiver=<optimized out>) at kernel/qcoreapplication.h:231
#16 QObjectPrivate::setParent_helper (this=0x804fdea8, o=<optimized out>) at
kernel/qobject.cpp:1996
#17 0xb4f15b2c in QObject::~QObject (this=<optimized out>, __in_chrg=<optimized
out>) at kernel/qobject.cpp:1048
#18 0xb4f1b7ff in QSocketNotifier::~QSocketNotifier (this=0x804fdf70,
__in_chrg=<optimized out>) at kernel/qsocketnotifier.cpp:162
#19 0xb4f1b82a in QSocketNotifier::~QSocketNotifier (this=0x804fdf70,
__in_chrg=<optimized out>) at kernel/qsocketnotifier.cpp:165
#20 0xb4e6f19d in QProcessPrivate::waitForDeadChild (this=0x804fd878) at
io/qprocess_unix.cpp:919
#21 0xb4e17c21 in QProcessPrivate::_q_processDied (this=0x804fd878) at
io/qprocess.cpp:1128
#22 0xb4e6effd in QProcessPrivate::waitForFinished (this=<optimized out>,
msecs=<optimized out>) at io/qprocess_unix.cpp:895
#23 0xb4e111f1 in QProcess::waitForFinished (this=0x80505a38, msecs=30000) at
io/qprocess.cpp:1922
#24 0xb4e11a3d in QProcess::~QProcess (this=<optimized out>,
__in_chrg=<optimized out>) at io/qprocess.cpp:1261
#25 0xb611493d in KProcess::~KProcess() () from
/usr/lib/i386-linux-gnu/libKF5CoreAddons.so.5
#26 0xb611497a in KProcess::~KProcess() () from
/usr/lib/i386-linux-gnu/libKF5CoreAddons.so.5
#27 0xb4f14b13 in QObjectPrivate::deleteChildren (this=0x804ecc60) at
kernel/qobject.cpp:1970
#28 0xb4f15af3 in QObject::~QObject (this=<optimized out>, __in_chrg=<optimized
out>) at kernel/qobject.cpp:1041
#29 0xb769c6d3 in KSMServer::~KSMServer (this=0x804f0998, __in_chrg=<optimized
out>) at ./ksmserver/server.cpp:728
#30 0xb769f01a in KSMServer::~KSMServer (this=0x804f0998, __in_chrg=<optimized
out>) at ./ksmserver/server.cpp:733
#31 0xb769adba in sighandler (sig=15) at ./ksmserver/server.cpp:539
#32 <signal handler called>

Apparently, ksmserver got a SIGTERM signal which resulted in a SIGABRT due to
the SIGTERM being received in another thread than the main thread (or, more
importantly, the thread where the objects that are subsequently destroyed
live), as we can see from the assertion message.

Also, the code doesn't seem safe - in a signal handler, only a limited number
of functions can be called, and I'm pretty sure this doesn't include QObject
functions.

To remedy both issues, I propose to use the self-pipe trick - alert the main
loop in the signal handler by writing to a pipe (or, in this case, socket), and
terminate ksmserver gracefully. See the attached patch.

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to