]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_timing: Don't close FD 0 when out of open files. 59/759/1
authorWalter Doekes <walter+asterisk@wjd.nu>
Thu, 2 Jul 2015 09:57:44 +0000 (11:57 +0200)
committerWalter Doekes <walter+asterisk@wjd.nu>
Thu, 2 Jul 2015 09:57:44 +0000 (11:57 +0200)
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
res/res_timing_timerfd.c

index 8ac2714740c23029b3b3c04f382dfbf0ad31455e..9ada1ae65e24a2925b57767e784d86a811c383cb 100644 (file)
@@ -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);
index 5c96dd6620b610ef9ef1a9cdb9f72768a14e44aa..41b5f7d4c3119932afd62f365792c9b3d5ef0d1c 100644 (file)
@@ -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);