mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2024-11-23 05:35:39 +01:00
Fix mutex double-free in RSA
When MBEDTLS_THREADING_C is enabled, RSA code protects the use of the key with a mutex. mbedtls_rsa_free() frees this mutex by calling mbedtls_mutex_free(). This does not match the usage of mbedtls_mutex_free(), which in general can only be done once. Signed-off-by: Gilles Peskine <Gilles.Peskine@arm.com>
This commit is contained in:
parent
54e7e2bdc7
commit
d7e82ad9bf
@ -499,6 +499,9 @@ void mbedtls_rsa_init( mbedtls_rsa_context *ctx,
|
|||||||
mbedtls_rsa_set_padding( ctx, padding, hash_id );
|
mbedtls_rsa_set_padding( ctx, padding, hash_id );
|
||||||
|
|
||||||
#if defined(MBEDTLS_THREADING_C)
|
#if defined(MBEDTLS_THREADING_C)
|
||||||
|
/* Set ctx->ver to nonzero to indicate that the mutex has been
|
||||||
|
* initialized and will need to be freed. */
|
||||||
|
ctx->ver = 1;
|
||||||
mbedtls_mutex_init( &ctx->mutex );
|
mbedtls_mutex_init( &ctx->mutex );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -2325,7 +2328,6 @@ int mbedtls_rsa_copy( mbedtls_rsa_context *dst, const mbedtls_rsa_context *src )
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
dst->ver = src->ver;
|
|
||||||
dst->len = src->len;
|
dst->len = src->len;
|
||||||
|
|
||||||
MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->N, &src->N ) );
|
MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->N, &src->N ) );
|
||||||
@ -2375,7 +2377,12 @@ void mbedtls_rsa_free( mbedtls_rsa_context *ctx )
|
|||||||
#endif /* MBEDTLS_RSA_NO_CRT */
|
#endif /* MBEDTLS_RSA_NO_CRT */
|
||||||
|
|
||||||
#if defined(MBEDTLS_THREADING_C)
|
#if defined(MBEDTLS_THREADING_C)
|
||||||
|
/* Free the mutex, but only if it hasn't been freed already. */
|
||||||
|
if( ctx->ver != 0 )
|
||||||
|
{
|
||||||
mbedtls_mutex_free( &ctx->mutex );
|
mbedtls_mutex_free( &ctx->mutex );
|
||||||
|
ctx->ver = 0;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user