diff --git a/ChangeLog b/ChangeLog index 8a736f971..86b6b5813 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ mbed TLS ChangeLog (Sorted per branch, date) += mbed TLS 2.2.1 released 2015-12-xx + +Security + * Fix potential double free when mbedtls_asn1_store_named_data() fails to + allocate memory. Only used for certificate generation, not triggerable + remotely in SSL/TLS. Found by RafaƂ Przywara. #367 + = mbed TLS 2.2.0 released 2015-11-04 Security diff --git a/library/asn1write.c b/library/asn1write.c index 456660d8b..00ed73c11 100644 --- a/library/asn1write.c +++ b/library/asn1write.c @@ -339,19 +339,18 @@ mbedtls_asn1_named_data *mbedtls_asn1_store_named_data( mbedtls_asn1_named_data } else if( cur->val.len < val_len ) { - // Enlarge existing value buffer if needed - // - mbedtls_free( cur->val.p ); - cur->val.p = NULL; - - cur->val.len = val_len; - cur->val.p = mbedtls_calloc( 1, val_len ); - if( cur->val.p == NULL ) - { - mbedtls_free( cur->oid.p ); - mbedtls_free( cur ); + /* + * Enlarge existing value buffer if needed + * Preserve old data until the allocation succeeded, to leave list in + * a consistent state in case allocation fails. + */ + void *p = mbedtls_calloc( 1, val_len ); + if( p == NULL ) return( NULL ); - } + + mbedtls_free( cur->val.p ); + cur->val.p = p; + cur->val.len = val_len; } if( val != NULL )