Skip to content

Commit 2ad3517

Browse files
authored
Merge pull request #27 from visitorckw/fix-timer-heap-corruption
Fix heap corruption in timer subsystem
2 parents 09435f8 + 7dcb79c commit 2ad3517

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

kernel/timer.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -227,11 +227,14 @@ void _timer_tick_handler(void)
227227
/* Collect expired timers in one pass, limited to batch size */
228228
while (!list_is_empty(kcb->timer_list) &&
229229
expired_count < TIMER_BATCH_SIZE) {
230-
timer_t *t = (timer_t *) kcb->timer_list->head->next->data;
230+
list_node_t *node = kcb->timer_list->head->next;
231+
timer_t *t = (timer_t *) node->data;
231232

232233
if (now >= t->deadline_ticks) {
233234
expired_timers[expired_count++] = t;
234-
list_pop(kcb->timer_list); /* O(1) removal from head */
235+
kcb->timer_list->head->next = node->next;
236+
kcb->timer_list->length--;
237+
return_timer_node(node);
235238
} else {
236239
/* First timer not expired, so none further down are */
237240
break;
@@ -347,7 +350,15 @@ int32_t mo_timer_destroy(uint16_t id)
347350
}
348351

349352
/* Remove from master list */
350-
list_remove(all_timers_list, node);
353+
list_node_t *prev = all_timers_list->head;
354+
while (prev->next != all_timers_list->tail && prev->next != node)
355+
prev = prev->next;
356+
357+
if (likely(prev->next == node)) {
358+
prev->next = node->next;
359+
all_timers_list->length--;
360+
}
361+
351362
free(t);
352363
return_timer_node(node);
353364

0 commit comments

Comments
 (0)