mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-26 08:51:13 +00:00
44 lines
1.3 KiB
Diff
44 lines
1.3 KiB
Diff
|
From 7c0ac64ebea38d0d9ff4d160db4d33bc087a3490 Mon Sep 17 00:00:00 2001
|
||
|
From: Robert McMahon <rjmcmahon@rjmcmahon.com>
|
||
|
Date: Mon, 16 Jul 2018 17:51:29 -0700
|
||
|
Subject: [PATCH] fix latent bug in signal handling, per POSIX calling exit()
|
||
|
in signal handler is not safe. Use _exit() instead. Also, detect the user
|
||
|
signal SIGINT for the case of server needing two invocations to stop server
|
||
|
threads. Note: the server threads still need some work from graceful
|
||
|
termination with a single ctrl-c
|
||
|
|
||
|
---
|
||
|
|
||
|
--- a/compat/signal.c
|
||
|
+++ b/compat/signal.c
|
||
|
@@ -171,7 +171,7 @@ void sig_exit( int inSigno ) {
|
||
|
static int num = 0;
|
||
|
if ( num++ == 0 ) {
|
||
|
fflush( 0 );
|
||
|
- exit( 0 );
|
||
|
+ _exit(0);
|
||
|
}
|
||
|
} /* end sig_exit */
|
||
|
|
||
|
--- a/src/main.cpp
|
||
|
+++ b/src/main.cpp
|
||
|
@@ -268,7 +268,7 @@ void Sig_Interupt( int inSigno ) {
|
||
|
// We try to not allow a single interrupt handled by multiple threads
|
||
|
// to completely kill the app so we save off the first thread ID
|
||
|
// then that is the only thread that can supply the next interrupt
|
||
|
- if ( thread_equalid( sThread, thread_zeroid() ) ) {
|
||
|
+ if ( (inSigno == SIGINT) && thread_equalid( sThread, thread_zeroid() ) ) {
|
||
|
sThread = thread_getid();
|
||
|
} else if ( thread_equalid( sThread, thread_getid() ) ) {
|
||
|
sig_exit( inSigno );
|
||
|
@@ -420,9 +420,3 @@ VOID ServiceStop() {
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
-
|
||
|
-
|
||
|
-
|
||
|
-
|
||
|
-
|
||
|
-
|