Skip to content

Commit f9cd029

Browse files
committed
Adjust shift cap for DNS backoff retries
1 parent 588becd commit f9cd029

3 files changed

Lines changed: 21 additions & 1 deletion

File tree

src/test/unit/unit.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ Suite *wolf_suite(void)
353353
tcase_add_test(tc_utils, test_sock_opts_and_names);
354354
tcase_add_test(tc_utils, test_dns_send_query_errors);
355355
tcase_add_test(tc_utils, test_dns_schedule_timer_initial_jitter_and_cancel);
356+
tcase_add_test(tc_utils, test_dns_schedule_timer_caps_large_retry_shift);
356357
tcase_add_test(tc_utils, test_dns_send_query_schedules_timeout);
357358
tcase_add_test(tc_utils, test_dns_resend_query_uses_stored_query_buffer);
358359
tcase_add_test(tc_utils, test_dns_abort_query_clears_timer_and_query_state);

src/test/unit/unit_tests_dns_dhcp.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1902,6 +1902,20 @@ START_TEST(test_dns_schedule_timer_initial_jitter_and_cancel)
19021902
}
19031903
END_TEST
19041904

1905+
START_TEST(test_dns_schedule_timer_caps_large_retry_shift)
1906+
{
1907+
struct wolfIP s;
1908+
1909+
wolfIP_init(&s);
1910+
s.last_tick = 100U;
1911+
s.dns_retry_count = 64U;
1912+
1913+
dns_schedule_timer(&s);
1914+
ck_assert_int_ne(s.dns_timer, NO_TIMER);
1915+
ck_assert_uint_eq(find_timer_expiry(&s, s.dns_timer), UINT64_MAX);
1916+
}
1917+
END_TEST
1918+
19051919
START_TEST(test_dns_send_query_schedules_timeout)
19061920
{
19071921
struct wolfIP s;

src/wolfip.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6468,6 +6468,7 @@ static void dns_schedule_timer(struct wolfIP *s)
64686468
{
64696469
struct wolfIP_timer tmr = { };
64706470
uint64_t interval = DNS_QUERY_TIMEOUT;
6471+
uint8_t shift;
64716472

64726473
if (!s)
64736474
return;
@@ -6478,7 +6479,11 @@ static void dns_schedule_timer(struct wolfIP *s)
64786479
interval = DNS_QUERY_TIMEOUT_INITIAL +
64796480
(wolfIP_getrandom() % DNS_QUERY_TIMEOUT_INITIAL_JITTER);
64806481
} else {
6481-
interval <<= s->dns_retry_count;
6482+
shift = s->dns_retry_count;
6483+
if (shift >= 64U || interval > (UINT64_MAX >> shift))
6484+
interval = UINT64_MAX - s->last_tick;
6485+
else
6486+
interval <<= shift;
64826487
}
64836488
tmr.expires = s->last_tick + interval;
64846489
tmr.arg = s;

0 commit comments

Comments
 (0)