generic: unblock signals when setting handlers for them

generally, those signals should not be blocked but it seems something is
blocking consequent SIGSEGV signals send by `kill` for example

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2022-12-07 07:45:25 +02:00
parent 053898e849
commit d258df3881
3 changed files with 46 additions and 19 deletions

View file

@ -87,6 +87,22 @@ static Atom kde_xdnd_drop = None;
static QByteArray* startup_id_tmp = nullptr;
#endif
static const int s_quit_signals[] = {
SIGTERM,
SIGHUP,
SIGINT,
0
};
static void quit_handler(int sig)
{
KDE_signal(sig, SIG_DFL);
if (qApp) {
qApp->quit();
}
}
/*
Private data to make keeping binary compatibility easier
*/
@ -779,24 +795,17 @@ void KApplication::updateRemoteUserTimestamp( const QString& service, int time )
#endif
}
static void quit_handler(int sig)
{
Q_UNUSED(sig);
KDE_signal(SIGTERM, SIG_DFL);
KDE_signal(SIGHUP, SIG_DFL);
KDE_signal(SIGINT, SIG_DFL);
if (qApp) {
qApp->quit();
}
}
void KApplication::quitOnSignal()
{
KDE_signal(SIGTERM, quit_handler);
KDE_signal(SIGHUP, quit_handler);
KDE_signal(SIGINT, quit_handler);
sigset_t handlermask;
::sigemptyset(&handlermask);
int counter = 0;
while (s_quit_signals[counter]) {
KDE_signal(s_quit_signals[counter], quit_handler);
::sigaddset(&handlermask, s_quit_signals[counter]);
counter++;
}
::sigprocmask(SIG_UNBLOCK, &handlermask, NULL);
}
void KApplication::setTopWidget( QWidget *topWidget )

View file

@ -81,11 +81,15 @@ void KCrash::setCrashHandler(HandlerType handler)
s_crashHandler = handler;
sigset_t handlermask;
::sigemptyset(&handlermask);
int counter = 0;
while (s_signals[counter]) {
KDE_signal(s_signals[counter], s_crashHandler);
::sigaddset(&handlermask, s_signals[counter]);
counter++;
}
::sigprocmask(SIG_UNBLOCK, &handlermask, NULL);
}
KCrash::HandlerType KCrash::crashHandler()

View file

@ -73,6 +73,13 @@ typedef QMap<QString,QByteArray> AuthKeysMap;
namespace KIO {
static const int s_quit_signals[] = {
SIGTERM,
SIGHUP,
SIGINT,
0
};
static QByteArray authInfoKey(const AuthInfo &authinfo)
{
return KPasswdStore::makeKey(authinfo.url.prettyUrl());
@ -178,6 +185,7 @@ extern "C" {
static void genericsig_handler(int sigNumber)
{
KDE_signal(sigNumber, SIG_IGN);
//WABA: Don't do anything that requires malloc, we can deadlock on it since
//a SIGTERM signal can come in while we are in malloc/free.
//kDebug()<<"kioslave : exiting due to signal "<<sigNumber;
@ -209,9 +217,15 @@ SlaveBase::SlaveBase( const QByteArray &protocol,
act.sa_flags = 0;
sigaction(SIGPIPE, &act, 0);
KDE_signal(SIGINT, &genericsig_handler);
KDE_signal(SIGQUIT, &genericsig_handler);
KDE_signal(SIGTERM, &genericsig_handler);
sigset_t handlermask;
::sigemptyset(&handlermask);
int counter = 0;
while (s_quit_signals[counter]) {
KDE_signal(s_quit_signals[counter], genericsig_handler);
::sigaddset(&handlermask, s_quit_signals[counter]);
counter++;
}
::sigprocmask(SIG_UNBLOCK, &handlermask, NULL);
globalSlave = this;