Skip to content
Snippets Groups Projects
Commit b090a8d4 authored by Walter Doekes's avatar Walter Doekes
Browse files

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
parent 9b74dcb6
No related branches found
No related tags found
No related merge requests found
......@@ -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);
......
......@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment