summaryrefslogtreecommitdiff
path: root/res/res_timing_timerfd.c
diff options
context:
space:
mode:
Diffstat (limited to 'res/res_timing_timerfd.c')
-rw-r--r--res/res_timing_timerfd.c45
1 files changed, 40 insertions, 5 deletions
diff --git a/res/res_timing_timerfd.c b/res/res_timing_timerfd.c
index 944687459..5c96dd662 100644
--- a/res/res_timing_timerfd.c
+++ b/res/res_timing_timerfd.c
@@ -44,7 +44,7 @@ static void *timing_funcs_handle;
static int timerfd_timer_open(void);
static void timerfd_timer_close(int handle);
static int timerfd_timer_set_rate(int handle, unsigned int rate);
-static void timerfd_timer_ack(int handle, unsigned int quantity);
+static int timerfd_timer_ack(int handle, unsigned int quantity);
static int timerfd_timer_enable_continuous(int handle);
static int timerfd_timer_disable_continuous(int handle);
static enum ast_timer_event timerfd_timer_get_event(int handle);
@@ -91,6 +91,7 @@ static void timer_destroy(void *obj)
{
struct timerfd_timer *timer = obj;
close(timer->handle);
+ timer->handle = -1;
}
static int timerfd_timer_open(void)
@@ -121,6 +122,11 @@ static void timerfd_timer_close(int handle)
.handle = handle,
};
+ if (handle == -1) {
+ ast_log(LOG_ERROR, "Attempting to close timerfd handle -1");
+ return;
+ }
+
if (!(our_timer = ao2_find(timerfd_timers, &find_helper, OBJ_POINTER))) {
ast_log(LOG_ERROR, "Couldn't find timer with handle %d\n", handle);
return;
@@ -137,6 +143,11 @@ static int timerfd_timer_set_rate(int handle, unsigned int rate)
};
int res = 0;
+ if (handle == -1) {
+ ast_log(LOG_ERROR, "Attempting to set rate on timerfd handle -1");
+ return -1;
+ }
+
if (!(our_timer = ao2_find(timerfd_timers, &find_helper, OBJ_POINTER))) {
ast_log(LOG_ERROR, "Couldn't find timer with handle %d\n", handle);
return -1;
@@ -158,17 +169,23 @@ static int timerfd_timer_set_rate(int handle, unsigned int rate)
return res;
}
-static void timerfd_timer_ack(int handle, unsigned int quantity)
+static int timerfd_timer_ack(int handle, unsigned int quantity)
{
uint64_t expirations;
int read_result = 0;
+ int res = 0;
struct timerfd_timer *our_timer, find_helper = {
.handle = handle,
};
+ if (handle == -1) {
+ ast_log(LOG_ERROR, "Attempting to ack timerfd handle -1");
+ return -1;
+ }
+
if (!(our_timer = ao2_find(timerfd_timers, &find_helper, OBJ_POINTER))) {
ast_log(LOG_ERROR, "Couldn't find a timer with handle %d\n", handle);
- return;
+ return -1;
}
ao2_lock(our_timer);
@@ -177,8 +194,9 @@ static void timerfd_timer_ack(int handle, unsigned int quantity)
struct itimerspec timer_status;
if (timerfd_gettime(handle, &timer_status)) {
- ast_log(LOG_ERROR, "Call to timerfd_gettime() error: %s\n", strerror(errno));
+ ast_log(LOG_ERROR, "Call to timerfd_gettime() using handle %d error: %s\n", handle, strerror(errno));
expirations = 0;
+ res = -1;
break;
}
@@ -194,6 +212,7 @@ static void timerfd_timer_ack(int handle, unsigned int quantity)
continue;
} else {
ast_log(LOG_ERROR, "Read error: %s\n", strerror(errno));
+ res = -1;
break;
}
}
@@ -205,6 +224,7 @@ static void timerfd_timer_ack(int handle, unsigned int quantity)
if (expirations != quantity) {
ast_debug(2, "Expected to acknowledge %u ticks but got %llu instead\n", quantity, (unsigned long long) expirations);
}
+ return res;
}
static int timerfd_timer_enable_continuous(int handle)
@@ -217,6 +237,11 @@ static int timerfd_timer_enable_continuous(int handle)
.handle = handle,
};
+ if (handle == -1) {
+ ast_log(LOG_ERROR, "Attempting to enable timerfd handle -1");
+ return -1;
+ }
+
if (!(our_timer = ao2_find(timerfd_timers, &find_helper, OBJ_POINTER))) {
ast_log(LOG_ERROR, "Couldn't find timer with handle %d\n", handle);
return -1;
@@ -246,13 +271,18 @@ static int timerfd_timer_disable_continuous(int handle)
.handle = handle,
};
+ if (handle == -1) {
+ ast_log(LOG_ERROR, "Attempting to disable timerfd handle -1");
+ return -1;
+ }
+
if (!(our_timer = ao2_find(timerfd_timers, &find_helper, OBJ_POINTER))) {
ast_log(LOG_ERROR, "Couldn't find timer with handle %d\n", handle);
return -1;
}
ao2_lock(our_timer);
- if(!our_timer->is_continuous) {
+ if (!our_timer->is_continuous) {
/* No reason to do anything if we're not
* in continuous mode
*/
@@ -276,6 +306,11 @@ static enum ast_timer_event timerfd_timer_get_event(int handle)
.handle = handle,
};
+ if (handle == -1) {
+ ast_log(LOG_ERROR, "Attempting to get event from timerfd handle -1");
+ return -1;
+ }
+
if (!(our_timer = ao2_find(timerfd_timers, &find_helper, OBJ_POINTER))) {
ast_log(LOG_ERROR, "Couldn't find timer with handle %d\n", handle);
return -1;