From 864108daabaf6fc005af472a2329729f3c3a14ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20P=C3=A9gouri=C3=A9-Gonnard?= Date: Fri, 29 May 2015 10:11:03 +0200 Subject: [PATCH] Move from gmtime_r to gmtime + mutexes * gmtime_r is not standard so -std=c99 warns about it * Anyway we need global mutexes in the threading layer, so better depend only on that, rather that global mutexes + some _r functions --- include/mbedtls/threading.h | 1 + library/threading.c | 3 +++ library/x509.c | 47 ++++++++++++++++++++++++------------- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/include/mbedtls/threading.h b/include/mbedtls/threading.h index 309727f18..ed355e68d 100644 --- a/include/mbedtls/threading.h +++ b/include/mbedtls/threading.h @@ -96,6 +96,7 @@ extern int (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t *mutex ); * Global mutexes */ extern mbedtls_threading_mutex_t mbedtls_threading_readdir_mutex; +extern mbedtls_threading_mutex_t mbedtls_threading_gmtime_mutex; #ifdef __cplusplus } diff --git a/library/threading.c b/library/threading.c index e904b195c..b499a44c8 100644 --- a/library/threading.c +++ b/library/threading.c @@ -112,6 +112,7 @@ void mbedtls_threading_set_alt( void (*mutex_init)( mbedtls_threading_mutex_t * mbedtls_mutex_unlock = mutex_unlock; mbedtls_mutex_init( &mbedtls_threading_readdir_mutex ); + mbedtls_mutex_init( &mbedtls_threading_gmtime_mutex ); } /* @@ -120,6 +121,7 @@ void mbedtls_threading_set_alt( void (*mutex_init)( mbedtls_threading_mutex_t * void mbedtls_threading_free_alt( void ) { mbedtls_mutex_free( &mbedtls_threading_readdir_mutex ); + mbedtls_mutex_free( &mbedtls_threading_gmtime_mutex ); } #endif /* MBEDTLS_THREADING_ALT */ @@ -130,5 +132,6 @@ void mbedtls_threading_free_alt( void ) #define MUTEX_INIT #endif mbedtls_threading_mutex_t mbedtls_threading_readdir_mutex MUTEX_INIT; +mbedtls_threading_mutex_t mbedtls_threading_gmtime_mutex MUTEX_INIT; #endif /* MBEDTLS_THREADING_C */ diff --git a/library/x509.c b/library/x509.c index 504fcf7bb..68cc02207 100644 --- a/library/x509.c +++ b/library/x509.c @@ -879,7 +879,7 @@ int mbedtls_x509_key_size_helper( char *buf, size_t size, const char *name ) */ #if defined(MBEDTLS_HAVE_TIME) -static void x509_get_current_time( mbedtls_x509_time *now ) +static int x509_get_current_time( mbedtls_x509_time *now ) { #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) SYSTEMTIME st; @@ -887,25 +887,38 @@ static void x509_get_current_time( mbedtls_x509_time *now ) GetSystemTime( &st ); now->year = st.wYear; - now->mon = st.wMonth; - now->day = st.wDay; + now->mon = st.wMonth; + now->day = st.wDay; now->hour = st.wHour; - now->min = st.wMinute; - now->sec = st.wSecond; + now->min = st.wMinute; + now->sec = st.wSecond; #else - struct tm lt; + struct tm *lt; time_t tt; - tt = time( NULL ); - gmtime_r( &tt, < ); +#if defined(MBEDTLS_THREADING_C) + if( mbedtls_mutex_lock( &mbedtls_threading_gmtime_mutex ) != 0 ) + return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); +#endif + + tt = time( NULL ); + lt = gmtime( &tt ); + + now->year = lt->tm_year + 1900; + now->mon = lt->tm_mon + 1; + now->day = lt->tm_mday; + now->hour = lt->tm_hour; + now->min = lt->tm_min; + now->sec = lt->tm_sec; + +#if defined(MBEDTLS_THREADING_C) + if( mbedtls_mutex_unlock( &mbedtls_threading_gmtime_mutex ) != 0 ) + return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); +#endif - now->year = lt.tm_year + 1900; - now->mon = lt.tm_mon + 1; - now->day = lt.tm_mday; - now->hour = lt.tm_hour; - now->min = lt.tm_min; - now->sec = lt.tm_sec; #endif /* _WIN32 && !EFIX64 && !EFI32 */ + + return( 0 ); } /* @@ -953,7 +966,8 @@ int mbedtls_x509_time_expired( const mbedtls_x509_time *to ) { mbedtls_x509_time now; - x509_get_current_time( &now ); + if( x509_get_current_time( &now ) != 0 ) + return( -1 ); return( x509_check_time( &now, to ) ); } @@ -962,7 +976,8 @@ int mbedtls_x509_time_future( const mbedtls_x509_time *from ) { mbedtls_x509_time now; - x509_get_current_time( &now ); + if( x509_get_current_time( &now ) != 0 ) + return( -1 ); return( x509_check_time( from, &now ) ); }