From b090a8d40bba11920714ba625fa0ae1c9fc94560 Mon Sep 17 00:00:00 2001 From: Walter Doekes Date: Thu, 2 Jul 2015 11:57:44 +0200 Subject: [PATCH] res_timing: Don't close FD 0 when out of open files. This fixes so a failure to get a timer file descriptor does not cascade to closing FD 0. On error, both res_timing_kqueue and res_timing_timerfd would call the destructor before setting the file handle. The file handle had been initialized to 0, causing FD 0 to be closed. This in turn, resulted in floods of "CLI>" messages and an unusable terminal. ASTERISK-19277 #close Reported by: Barry Chern Change-Id: I147d7e33726c6e5a2751928d56561494f5800350 --- res/res_timing_kqueue.c | 7 ++++--- res/res_timing_timerfd.c | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/res/res_timing_kqueue.c b/res/res_timing_kqueue.c index 8ac2714740..9ada1ae65e 100644 --- a/res/res_timing_kqueue.c +++ b/res/res_timing_kqueue.c @@ -93,7 +93,9 @@ static int kqueue_timer_cmp(void *obj, void *args, int flags) static void timer_destroy(void *obj) { struct kqueue_timer *timer = obj; - close(timer->handle); + if (timer->handle > -1) { + close(timer->handle); + } } #define lookup_timer(a) _lookup_timer(a, __FILE__, __LINE__, __PRETTY_FUNCTION__) @@ -121,13 +123,12 @@ static int kqueue_timer_open(void) ast_log(LOG_ERROR, "Could not allocate memory for kqueue_timer structure\n"); return -1; } - if ((handle = kqueue()) < 0) { + if ((timer->handle = handle = kqueue()) < 0) { ast_log(LOG_ERROR, "Failed to create kqueue timer: %s\n", strerror(errno)); ao2_ref(timer, -1); return -1; } - timer->handle = handle; ao2_link(kqueue_timers, timer); /* Get rid of the reference from the allocation */ ao2_ref(timer, -1); diff --git a/res/res_timing_timerfd.c b/res/res_timing_timerfd.c index 5c96dd6620..41b5f7d4c3 100644 --- a/res/res_timing_timerfd.c +++ b/res/res_timing_timerfd.c @@ -90,7 +90,9 @@ static int timerfd_timer_cmp(void *obj, void *args, int flags) static void timer_destroy(void *obj) { struct timerfd_timer *timer = obj; - close(timer->handle); + if (timer->handle > -1) { + close(timer->handle); + } timer->handle = -1; } @@ -103,13 +105,12 @@ static int timerfd_timer_open(void) ast_log(LOG_ERROR, "Could not allocate memory for timerfd_timer structure\n"); return -1; } - if ((handle = timerfd_create(CLOCK_MONOTONIC, 0)) < 0) { + if ((timer->handle = handle = timerfd_create(CLOCK_MONOTONIC, 0)) < 0) { ast_log(LOG_ERROR, "Failed to create timerfd timer: %s\n", strerror(errno)); ao2_ref(timer, -1); return -1; } - timer->handle = handle; ao2_link(timerfd_timers, timer); /* Get rid of the reference from the allocation */ ao2_ref(timer, -1);