diff --git a/res/res_calendar.c b/res/res_calendar.c
index ba0079679ff908a377b6d30c6a6ee8e389ba56c5..98f9169347c9b030edfc2d669ddbf16d448b52bc 100644
--- a/res/res_calendar.c
+++ b/res/res_calendar.c
@@ -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) {