]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_calendar: Prevent assertion if event ends in past.
authorNaveen Albert <asterisk@phreaknet.org>
Wed, 23 Mar 2022 11:05:28 +0000 (11:05 +0000)
committerKevin Harwell <kharwell@digium.com>
Mon, 6 Jun 2022 22:44:57 +0000 (17:44 -0500)
res_calendar will trigger an assertion currently
if the ending time is calculated to be in the past.
Unlike the reminder and start times, however, there
is currently no check to catch non-positive times
and set them to 1. As a result, if we get a negative
value by happenstance, this can cause a crash.

To prevent the assertion from begin triggered, we now
use the same logic as the reminder and start events
to catch this issue before it can cause a problem.

ASTERISK-29981 #close

Change-Id: Idfb3204d195f350d2575fb4bc72a54a597d6e93c

res/res_calendar.c

index ba0079679ff908a377b6d30c6a6ee8e389ba56c5..98f9169347c9b030edfc2d669ddbf16d448b52bc 100644 (file)
@@ -998,10 +998,15 @@ static int schedule_calendar_event(struct ast_calendar *cal, struct ast_calendar
        if (!cmp_event || old_event->end != event->end) {
                changed = 1;
                devstate_sched_end = (event->end - now.tv_sec) * 1000;
-               ast_mutex_lock(&refreshlock);
-               AST_SCHED_REPLACE(old_event->bs_end_sched, sched, devstate_sched_end, calendar_devstate_change, old_event);
-               ast_mutex_unlock(&refreshlock);
-               ast_debug(3, "Calendar bs_end event notification scheduled to happen in %ld ms\n", (long) devstate_sched_end);
+
+               if (devstate_sched_end <= 0) { /* if we let this slip by, Asterisk will assert */
+                       ast_log(LOG_WARNING, "Whoops! Event end notification scheduled in the past: %ld ms\n", (long) devstate_sched_end);
+               } else {
+                       ast_mutex_lock(&refreshlock);
+                       AST_SCHED_REPLACE(old_event->bs_end_sched, sched, devstate_sched_end, calendar_devstate_change, old_event);
+                       ast_mutex_unlock(&refreshlock);
+                       ast_debug(3, "Calendar bs_end event notification scheduled to happen in %ld ms\n", (long) devstate_sched_end);
+               }
        }
 
        if (changed) {