From 7b9a6850a3fc11b22d202229edd6a9af8df9d3b3 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Thu, 9 Dec 2021 13:40:21 +0100 Subject: [PATCH 1/2] sys/ztimer64: make _del_entry_from_list() safe for uninit ztimer64_t --- sys/ztimer64/ztimer64.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sys/ztimer64/ztimer64.c b/sys/ztimer64/ztimer64.c index 71baea29c8..4e1021c9e5 100644 --- a/sys/ztimer64/ztimer64.c +++ b/sys/ztimer64/ztimer64.c @@ -128,6 +128,9 @@ static int _add_entry_to_list(ztimer64_clock_t *clock, ztimer64_base_t *entry) static int _del_entry_from_list(ztimer64_clock_t *clock, ztimer64_base_t *entry) { DEBUG("_del_entry_from_list()\n"); + if (!clock->first) { + return 0; + } assert(_is_set((ztimer64_t *)entry)); if (clock->first == entry) { /* special case: removing first entry */ From 835db7d97f072e1e8b5e5ae2b612ae8a0c012390 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Thu, 9 Dec 2021 14:10:16 +0100 Subject: [PATCH 2/2] tests/unittests: add ztimer64 regression test --- .../tests-ztimer64/tests-ztimer64-core.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/unittests/tests-ztimer64/tests-ztimer64-core.c b/tests/unittests/tests-ztimer64/tests-ztimer64-core.c index f5fd837085..a494bdbd4b 100644 --- a/tests/unittests/tests-ztimer64/tests-ztimer64-core.c +++ b/tests/unittests/tests-ztimer64/tests-ztimer64-core.c @@ -198,6 +198,24 @@ static void test_ztimer64_checkpoint(void) TEST_ASSERT_EQUAL_INT(2 * ZTIMER64_CHECKPOINT_INTERVAL + UINT32_MAX, now64); } +static void test_ztimer64_set_uninitialized(void) +{ + /* regression test for setting an uninitialized ztimer64 on an empty clock */ + ztimer_mock_t zmock; + ztimer_clock_t *z = &zmock.super; + ztimer64_clock_t z64mock; + ztimer64_clock_t *z64 = &z64mock; + + memset(&zmock, '\0', sizeof(ztimer_mock_t)); + memset(&z64mock, '\0', sizeof(ztimer64_clock_t)); + /* ztimer base clock is already extended to 32bit */ + ztimer_mock_init(&zmock, 32); + ztimer64_clock_init(z64, z); + + ztimer64_t timer = { .base.target = 1 }; + ztimer64_set(z64, &timer, 0); +} + Test *tests_ztimer64_tests(void) { EMB_UNIT_TESTFIXTURES(fixtures) { @@ -206,6 +224,7 @@ Test *tests_ztimer64_tests(void) new_TestFixture(test_ztimer64_set_0), new_TestFixture(test_ztimer64_set_at), new_TestFixture(test_ztimer64_checkpoint), + new_TestFixture(test_ztimer64_set_uninitialized), }; EMB_UNIT_TESTCALLER(ztimer64_tests, setup, NULL, fixtures);