iperf: fix --daemon option
[openwrt/staging/chunkeey.git] / package / network / utils / iperf / patches / 0001-fix-latent-bug-in-signal-handling-per-POSIX-calling-.patch
diff --git a/package/network/utils/iperf/patches/0001-fix-latent-bug-in-signal-handling-per-POSIX-calling-.patch b/package/network/utils/iperf/patches/0001-fix-latent-bug-in-signal-handling-per-POSIX-calling-.patch
new file mode 100644 (file)
index 0000000..a713e06
--- /dev/null
@@ -0,0 +1,43 @@
+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
+-
+-
+-
+-
+-
+-