diff -up gnutls-1.4.1/lib/auth_dh_common.c.data-size gnutls-1.4.1/lib/auth_dh_common.c --- gnutls-1.4.1/lib/auth_dh_common.c.data-size 2006-03-08 11:44:59.000000000 +0100 +++ gnutls-1.4.1/lib/auth_dh_common.c 2012-03-22 16:09:14.427192286 +0100 @@ -165,8 +165,6 @@ _gnutls_gen_dh_common_client_kx (gnutls_ goto error; } - _gnutls_dh_set_peer_public (session, session->key->client_Y); - /* THESE SHOULD BE DISCARDED */ _gnutls_mpi_release (&session->key->client_Y); _gnutls_mpi_release (&session->key->client_p); diff -up gnutls-1.4.1/lib/gnutls_auth.c.data-size gnutls-1.4.1/lib/gnutls_auth.c --- gnutls-1.4.1/lib/gnutls_auth.c.data-size 2006-03-08 11:44:59.000000000 +0100 +++ gnutls-1.4.1/lib/gnutls_auth.c 2012-03-22 16:09:14.428192298 +0100 @@ -394,14 +394,17 @@ _gnutls_auth_info_set (gnutls_session_t */ if (gnutls_auth_get_type (session) != session->key->auth_info_type) { + + _gnutls_free_auth_info (session); + session->key->auth_info = - gnutls_realloc_fast (session->key->auth_info, size); + calloc( 1, size); if (session->key->auth_info == NULL) { gnutls_assert (); return GNUTLS_E_MEMORY_ERROR; } - memset (session->key->auth_info, 0, size); + session->key->auth_info_type = type; session->key->auth_info_size = size; } diff -up gnutls-1.4.1/lib/gnutls_session.c.data-size gnutls-1.4.1/lib/gnutls_session.c --- gnutls-1.4.1/lib/gnutls_session.c.data-size 2006-03-08 11:44:59.000000000 +0100 +++ gnutls-1.4.1/lib/gnutls_session.c 2012-03-22 16:10:27.184695435 +0100 @@ -25,6 +25,7 @@ #include "gnutls_errors.h" #include "debug.h" #include <gnutls_session_pack.h> +#include <gnutls_datum.h> /** * gnutls_session_get_data - Returns all session parameters. @@ -58,15 +59,23 @@ gnutls_session_get_data (gnutls_session_ gnutls_assert (); return ret; } - *session_data_size = psession.size; if (psession.size > *session_data_size) - return GNUTLS_E_SHORT_MEMORY_BUFFER; + { + *session_data_size = psession.size; + ret = GNUTLS_E_SHORT_MEMORY_BUFFER; + goto error; + } + *session_data_size = psession.size; if (session_data != NULL) memcpy (session_data, psession.data, psession.size); - return 0; + ret = 0; + +error: + _gnutls_free_datum( &psession); + return ret; } /** diff -up gnutls-1.4.1/lib/gnutls_session_pack.c.data-size gnutls-1.4.1/lib/gnutls_session_pack.c --- gnutls-1.4.1/lib/gnutls_session_pack.c.data-size 2006-03-08 11:44:59.000000000 +0100 +++ gnutls-1.4.1/lib/gnutls_session_pack.c 2012-03-22 16:09:14.429192310 +0100 @@ -165,7 +165,7 @@ _gnutls_session_unpack (gnutls_session_t return GNUTLS_E_INTERNAL_ERROR; } - if (session->key->auth_info != NULL) + if (_gnutls_get_auth_info(session) != NULL) { _gnutls_free_auth_info (session); } @@ -260,13 +260,6 @@ pack_certificate_auth_info (gnutls_sessi int cert_size, pack_size; cert_auth_info_t info = _gnutls_get_auth_info (session); - - if (info == NULL && session->key->auth_info_size != 0) - { - gnutls_assert (); - return GNUTLS_E_INVALID_REQUEST; - } - if (info) { cert_size = 4; @@ -510,12 +503,6 @@ pack_srp_auth_info (gnutls_session_t ses srp_server_auth_info_t info = _gnutls_get_auth_info (session); int pack_size; - if (info == NULL && session->key->auth_info_size != 0) - { - gnutls_assert (); - return GNUTLS_E_INVALID_REQUEST; - } - if (info && info->username) pack_size = strlen (info->username) + 1; /* include the terminating null */ else @@ -619,12 +606,6 @@ pack_anon_auth_info (gnutls_session_t se int pos = 0; size_t pack_size; - if (info == NULL && session->key->auth_info_size != 0) - { - gnutls_assert (); - return GNUTLS_E_INVALID_REQUEST; - } - if (info) pack_size = 2 + 4 * 3 + info->dh.prime.size + info->dh.generator.size + info->dh.public_key.size; @@ -783,12 +764,6 @@ pack_psk_auth_info (gnutls_session_t ses info = _gnutls_get_auth_info (session); - if (info == NULL && session->key->auth_info_size != 0) - { - gnutls_assert (); - return GNUTLS_E_INVALID_REQUEST; - } - if (info) { username_size = strlen (info->username) + 1; /* include the terminating null */