diff --git a/ChangeLog b/ChangeLog index cf5897b4a..38f14ddb5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -56,6 +56,8 @@ Bugfix containing a client certificate * ssl_init() was leaving a dirty pointer in ssl_context if malloc of out_ctr failed + * ssl_handshake_init() was leaving dirty pointers in subcontexts if malloc + of one of them failed * Fix typo in rsa_copy() that impacted PKCS#1 v2 contexts = PolarSSL 1.3.4 released on 2014-01-27 diff --git a/library/ssl_tls.c b/library/ssl_tls.c index f38802dde..681b7c39d 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -3318,6 +3318,9 @@ static int ssl_handshake_init( ssl_context *ssl ) { ssl->transform_negotiate = (ssl_transform *) polarssl_malloc( sizeof(ssl_transform) ); + + if( ssl->transform_negotiate != NULL ) + memset( ssl->transform_negotiate, 0, sizeof(ssl_transform) ); } if( ssl->session_negotiate ) @@ -3326,6 +3329,9 @@ static int ssl_handshake_init( ssl_context *ssl ) { ssl->session_negotiate = (ssl_session *) polarssl_malloc( sizeof(ssl_session) ); + + if( ssl->session_negotiate != NULL ) + memset( ssl->session_negotiate, 0, sizeof(ssl_session) ); } if( ssl->handshake ) @@ -3334,6 +3340,9 @@ static int ssl_handshake_init( ssl_context *ssl ) { ssl->handshake = (ssl_handshake_params *) polarssl_malloc( sizeof(ssl_handshake_params) ); + + if( ssl->handshake != NULL ) + memset( ssl->handshake, 0, sizeof(ssl_handshake_params) ); } if( ssl->handshake == NULL || @@ -3344,10 +3353,6 @@ static int ssl_handshake_init( ssl_context *ssl ) 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) ); - #if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \ defined(POLARSSL_SSL_PROTO_TLS1_1) md5_starts( &ssl->handshake->fin_md5 );