]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
[Bug 2814] msyslog deadlock when signaled. perlinger@ntp.org
authorJuergen Perlinger <perlinger@ntp.org>
Sun, 6 Dec 2015 20:33:26 +0000 (21:33 +0100)
committerJuergen Perlinger <perlinger@ntp.org>
Sun, 6 Dec 2015 20:33:26 +0000 (21:33 +0100)
 - applied patch by shenpeng11@huawei.com with minor adjustments

bk: 56649b96kijAcKTVg2Gwvt6ZgHtmEA

ChangeLog
ntpd/ntpd.c

index 187220daa26431f15d5962d25f6ee21b6888169d..0c69148db72fbadf2bd75beaa874870e951a8427 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -17,6 +17,8 @@
 * CID 1341681: Nits in sntp/tests/keyFile.c.  HStenn.
 * CID 1341682: Nit in libntp/authreadkeys.c.  HStenn.
 * CID 1341684: Nit in tests/ntpd/t-ntp_signd.c.  HStenn.
+* [Bug 2814] msyslog deadlock when signaled. perlinger@ntp.org
+  - applied patch by shenpeng11@huawei.com with minor adjustments
 * [Bug 2829] Look at pipe_fds in ntpd.c  (did so. perlinger@ntp.org)
 * [Bug 2887] stratum -1 config results as showing value 99
   - fudge stratum only accepts values [0..16]. perlinger@ntp.org
index 7630aee43bdaa83df1076c91681e8a302b4ba6e9..27b8a814ba0c4dc9b3de1ca1d31548a4c5068b3c 100644 (file)
@@ -209,6 +209,11 @@ extern int syscall (int, ...);
 
 
 #if !defined(SIM) && defined(SIGDIE1)
+static volatile int signalled  = 0;
+static volatile int signo      = 0;
+
+/* In an ideal world, 'finish_safe()' would declared as noreturn... */
+static void            finish_safe     (int);
 static RETSIGTYPE      finish          (int);
 #endif
 
@@ -1204,6 +1209,10 @@ int scmp_sc[] = {
 # ifdef HAVE_IO_COMPLETION_PORT
 
        for (;;) {
+#if !defined(SIM) && defined(SIGDIE1)
+               if (signalled)
+                       finish_safe(signo);
+#endif
                GetReceivedBuffers();
 # else /* normal I/O */
 
@@ -1211,6 +1220,10 @@ int scmp_sc[] = {
        was_alarmed = FALSE;
 
        for (;;) {
+#if !defined(SIM) && defined(SIGDIE1)
+               if (signalled)
+                       finish_safe(signo);
+#endif         
                if (alarm_flag) {       /* alarmed? */
                        was_alarmed = TRUE;
                        alarm_flag = FALSE;
@@ -1330,9 +1343,9 @@ int scmp_sc[] = {
 /*
  * finish - exit gracefully
  */
-static RETSIGTYPE
-finish(
-       int sig
+static void
+finish_safe(
+       int     sig
        )
 {
        const char *sig_desc;
@@ -1353,6 +1366,16 @@ finish(
        peer_cleanup();
        exit(0);
 }
+
+static RETSIGTYPE
+finish(
+       int     sig
+       )
+{
+       signalled = 1;
+       signo = sig;
+}
+
 #endif /* !SIM && SIGDIE1 */