From: Guus Sliepen <guus@tinc-vpn.org>
Date: Wed, 14 Feb 2007 09:20:20 +0000 (+0000)
Subject: Apply patch from Scott Lamb preventing an infinite loop when sending SIGALRM.
X-Git-Tag: import-tinc-1.1~678
X-Git-Url: https://git.meshlink.io/?a=commitdiff_plain;h=6c6535a4161d04accb3a22c51477e9f92ae34086;p=meshlink

Apply patch from Scott Lamb preventing an infinite loop when sending SIGALRM.
---

diff --git a/src/event.c b/src/event.c
index e7fbb882..c791205f 100644
--- a/src/event.c
+++ b/src/event.c
@@ -57,6 +57,28 @@ void exit_events(void)
 	avl_delete_tree(event_tree);
 }
 
+void flush_events(void)
+{
+	avl_tree_t *to_flush;
+	event_t *event;
+
+	/*
+	 * Events can be inserted from event handlers, so only flush events
+	 * already in the priority queue.
+	 */
+
+	cp();
+
+	to_flush = event_tree;
+	init_events();
+	while (to_flush->head) {
+		event = to_flush->head->data;
+		event->handler(event->data);
+		avl_delete(to_flush, event);
+	}
+	avl_delete_tree(to_flush);
+}
+
 event_t *new_event(void)
 {
 	cp();
diff --git a/src/event.h b/src/event.h
index 275bed52..50e5b972 100644
--- a/src/event.h
+++ b/src/event.h
@@ -38,6 +38,7 @@ typedef struct {
 
 extern void init_events(void);
 extern void exit_events(void);
+extern void flush_events(void);
 extern event_t *new_event(void) __attribute__ ((__malloc__));
 extern void free_event(event_t *);
 extern void event_add(event_t *);
diff --git a/src/net.c b/src/net.c
index 31f1b0e4..f6b14704 100644
--- a/src/net.c
+++ b/src/net.c
@@ -429,12 +429,7 @@ int main_loop(void)
 
 		if(sigalrm) {
 			logger(LOG_INFO, _("Flushing event queue"));
-
-			while(event_tree->head) {
-				event = event_tree->head->data;
-				event->handler(event->data);
-				event_del(event);
-			}
+			flush_events();
 			sigalrm = false;
 		}