Make sure no random pointer occur during failed malloc()'s

This commit is contained in:
Paul Bakker 2014-07-08 11:39:19 +02:00
parent 345316db65
commit 24aaf44120
2 changed files with 15 additions and 4 deletions

View file

@ -39,6 +39,9 @@ Bugfix
Alex Wilson.) Alex Wilson.)
* ssl_init() was leaving a dirty pointer in ssl_context if malloc of * ssl_init() was leaving a dirty pointer in ssl_context if malloc of
out_ctr failed out_ctr failed
* ssl_handshake_init() was leaving dirty pointers in subcontexts if malloc
of one of them failed
= Version 1.2.10 released 2013-10-07 = Version 1.2.10 released 2013-10-07
Changes Changes

View file

@ -2959,17 +2959,29 @@ int ssl_handshake_init( ssl_context *ssl )
if( ssl->transform_negotiate ) if( ssl->transform_negotiate )
ssl_transform_free( ssl->transform_negotiate ); ssl_transform_free( ssl->transform_negotiate );
else else
{
ssl->transform_negotiate = malloc( sizeof(ssl_transform) ); ssl->transform_negotiate = malloc( sizeof(ssl_transform) );
if( ssl->transform_negotiate != NULL )
memset( ssl->transform_negotiate, 0, sizeof(ssl_transform) );
}
if( ssl->session_negotiate ) if( ssl->session_negotiate )
ssl_session_free( ssl->session_negotiate ); ssl_session_free( ssl->session_negotiate );
else else
{
ssl->session_negotiate = malloc( sizeof(ssl_session) ); ssl->session_negotiate = malloc( sizeof(ssl_session) );
if( ssl->session_negotiate != NULL )
memset( ssl->session_negotiate, 0, sizeof(ssl_session) );
}
if( ssl->handshake ) if( ssl->handshake )
ssl_handshake_free( ssl->handshake ); ssl_handshake_free( ssl->handshake );
else else
{
ssl->handshake = malloc( sizeof(ssl_handshake_params) ); ssl->handshake = malloc( sizeof(ssl_handshake_params) );
if( ssl->handshake != NULL )
memset( ssl->handshake, 0, sizeof(ssl_handshake_params) );
}
if( ssl->handshake == NULL || if( ssl->handshake == NULL ||
ssl->transform_negotiate == NULL || ssl->transform_negotiate == NULL ||
@ -2979,10 +2991,6 @@ int ssl_handshake_init( ssl_context *ssl )
return( POLARSSL_ERR_SSL_MALLOC_FAILED ); return( POLARSSL_ERR_SSL_MALLOC_FAILED );
} }
memset( ssl->handshake, 0, sizeof(ssl_handshake_params) );
memset( ssl->transform_negotiate, 0, sizeof(ssl_transform) );
memset( ssl->session_negotiate, 0, sizeof(ssl_session) );
md5_starts( &ssl->handshake->fin_md5 ); md5_starts( &ssl->handshake->fin_md5 );
sha1_starts( &ssl->handshake->fin_sha1 ); sha1_starts( &ssl->handshake->fin_sha1 );
sha2_starts( &ssl->handshake->fin_sha2, 0 ); sha2_starts( &ssl->handshake->fin_sha2, 0 );