From b2034b77854f53ecebf713d92eaa2eb6823c3d9e Mon Sep 17 00:00:00 2001 From: Hanno Becker Date: Wed, 26 Apr 2017 11:46:46 +0100 Subject: [PATCH] Fix potential stack underflow in mpi_read_file. When provided with an empty line, mpi_read_file causes a numeric underflow resulting in a stack underflow. This commit fixes this and adds some documentation to mpi_read_file. --- ChangeLog | 7 +++++++ include/mbedtls/bignum.h | 11 ++++++++++- library/bignum.c | 6 +++--- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 13de8672c..fc67df6a2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ mbed TLS ChangeLog (Sorted per branch, date) += mbed TLS x.x.x branch released xxxx-xx-xx + +Bugfix + * Fix potential stack underflow in mpi_read_file. + Found by Guido Vranken. + + = mbed TLS 2.4.2 branch released 2017-03-08 Security diff --git a/include/mbedtls/bignum.h b/include/mbedtls/bignum.h index aa51556a5..ffd308cd0 100644 --- a/include/mbedtls/bignum.h +++ b/include/mbedtls/bignum.h @@ -340,7 +340,7 @@ int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix, #if defined(MBEDTLS_FS_IO) /** - * \brief Read X from an opened file + * \brief Read MPI from a line in an opened file * * \param X Destination MPI * \param radix Input numeric base @@ -349,6 +349,15 @@ int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix, * \return 0 if successful, MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if * the file read buffer is too small or a * MBEDTLS_ERR_MPI_XXX error code + * + * \note On success, this function advances the file stream + * to the end of the current line or to EOF. + * + * The function returns 0 on an empty line. + * + * Leading whitespaces are ignored, as is a + * '0x' prefix for radix 16. + * */ int mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin ); diff --git a/library/bignum.c b/library/bignum.c index 8b9082cdc..4e7c6e4f7 100644 --- a/library/bignum.c +++ b/library/bignum.c @@ -616,11 +616,11 @@ int mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin ) if( slen == sizeof( s ) - 2 ) return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL ); - if( s[slen - 1] == '\n' ) { slen--; s[slen] = '\0'; } - if( s[slen - 1] == '\r' ) { slen--; s[slen] = '\0'; } + if( slen > 0 && s[slen - 1] == '\n' ) { slen--; s[slen] = '\0'; } + if( slen > 0 && s[slen - 1] == '\r' ) { slen--; s[slen] = '\0'; } p = s + slen; - while( --p >= s ) + while( p-- > s ) if( mpi_get_digit( &d, radix, *p ) != 0 ) break;