Fix a build error with MSVC

Also fixes a minor bug on Windows with timers running over ~49 days.

Signed-off-by: Gilles Peskine <Gilles.Peskine@arm.com>
This commit is contained in:
Gilles Peskine
2026-02-19 14:16:42 +01:00
parent 7ea318246c
commit 5890b22b82
5 changed files with 16 additions and 6 deletions

View File

@@ -3,3 +3,11 @@ API changes
TF-PSA-Crypto configuration, unless MBEDTLS_TIMING_ALT is enabled. TF-PSA-Crypto configuration, unless MBEDTLS_TIMING_ALT is enabled.
As a benefit, platforms where the default implementation is not As a benefit, platforms where the default implementation is not
supported now only need to implement MBEDTLS_PLATFORM_MS_TIME_ALT. supported now only need to implement MBEDTLS_PLATFORM_MS_TIME_ALT.
* When MBEDTLS_TIMING_ALT is enabled, the function
mbedtls_timing_get_timer() now returns unsigned long long instead
of unsigned long.
Bugfix
* mbedtls_timing_get_delay() now correctly treats a timer as expired
after more than 2^32 ms (about 49 days) on platforms where long is
a 32-bit type.

View File

@@ -53,7 +53,7 @@ typedef struct mbedtls_timing_delay_context {
#endif /* MBEDTLS_TIMING_ALT */ #endif /* MBEDTLS_TIMING_ALT */
/* Internal use */ /* Internal use */
unsigned long mbedtls_timing_get_timer(struct mbedtls_timing_hr_time *val, int reset); unsigned long long mbedtls_timing_get_timer(struct mbedtls_timing_hr_time *val, int reset);
/** /**
* \brief Set a pair of delays to watch * \brief Set a pair of delays to watch

View File

@@ -13,7 +13,7 @@
#if !defined(MBEDTLS_TIMING_ALT) #if !defined(MBEDTLS_TIMING_ALT)
unsigned long mbedtls_timing_get_timer(struct mbedtls_timing_hr_time *val, int reset) unsigned long long mbedtls_timing_get_timer(struct mbedtls_timing_hr_time *val, int reset)
{ {
if (reset) { if (reset) {
val->ms = mbedtls_ms_time(); val->ms = mbedtls_ms_time();
@@ -45,7 +45,7 @@ void mbedtls_timing_set_delay(void *data, uint32_t int_ms, uint32_t fin_ms)
int mbedtls_timing_get_delay(void *data) int mbedtls_timing_get_delay(void *data)
{ {
mbedtls_timing_delay_context *ctx = (mbedtls_timing_delay_context *) data; mbedtls_timing_delay_context *ctx = (mbedtls_timing_delay_context *) data;
unsigned long elapsed_ms; unsigned long long elapsed_ms;
if (ctx->fin_ms == 0) { if (ctx->fin_ms == 0) {
return -1; return -1;

View File

@@ -360,7 +360,9 @@ static unsigned elapsed_time(void)
return 0; return 0;
} }
return mbedtls_timing_get_timer(&hires, 0); /* Wraps after ~49.7 days (assuming 32-bit int).
* Don't run udp_proxy that long! */
return (unsigned) mbedtls_timing_get_timer(&hires, 0);
} }
typedef struct { typedef struct {

View File

@@ -82,7 +82,7 @@ int main(int argc, char *argv[])
int exit_code = MBEDTLS_EXIT_FAILURE; int exit_code = MBEDTLS_EXIT_FAILURE;
unsigned i, j; unsigned i, j;
struct mbedtls_timing_hr_time timer; struct mbedtls_timing_hr_time timer;
unsigned long ms; unsigned long long ms;
psa_status_t status = psa_crypto_init(); psa_status_t status = psa_crypto_init();
if (status != PSA_SUCCESS) { if (status != PSA_SUCCESS) {
@@ -151,7 +151,7 @@ int main(int argc, char *argv[])
mbedtls_printf("."); mbedtls_printf(".");
} }
ms = mbedtls_timing_get_timer(&timer, 0); ms = mbedtls_timing_get_timer(&timer, 0);
mbedtls_printf("\n%u iterations -> %lu ms\n", opt.iterations, ms); mbedtls_printf("\n%u iterations -> %llu ms\n", opt.iterations, ms);
exit_code = MBEDTLS_EXIT_SUCCESS; exit_code = MBEDTLS_EXIT_SUCCESS;
exit: exit: