diff options
author | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2017-10-10 09:59:17 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2018-02-19 15:29:36 +0100 |
commit | 3bd2a33c7ba41287fb6578059a555f70146b17de (patch) | |
tree | 9b38607948c72ea379290a85d1c36eb38452083d /lib/auth/cert.c | |
parent | b0cc77556290b8fff7c73c71e931dfc226bfda82 (diff) | |
download | gnutls-3bd2a33c7ba41287fb6578059a555f70146b17de.tar.gz |
_gnutls_copy_certificate_auth_info: simplified and avoid multiple allocations
Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
Diffstat (limited to 'lib/auth/cert.c')
-rw-r--r-- | lib/auth/cert.c | 44 |
1 files changed, 14 insertions, 30 deletions
diff --git a/lib/auth/cert.c b/lib/auth/cert.c index 6d618a3532..2d02465089 100644 --- a/lib/auth/cert.c +++ b/lib/auth/cert.c @@ -69,14 +69,12 @@ _gnutls_selected_certs_set(gnutls_session_t session, typedef enum CertificateSigType { RSA_SIGN = 1, DSA_SIGN = 2, ECDSA_SIGN = 64 } CertificateSigType; -/* Copies data from a internal certificate struct (gnutls_pcert_st) to - * exported certificate struct (cert_auth_info_t) +/* Moves data from a internal certificate struct (gnutls_pcert_st) to + * another internal certificate struct (cert_auth_info_t), and deinitializes + * the former. */ -int _gnutls_copy_certificate_auth_info(cert_auth_info_t info, gnutls_pcert_st * certs, size_t ncerts) +int _gnutls_pcert_to_auth_info(cert_auth_info_t info, gnutls_pcert_st * certs, size_t ncerts) { - /* Copy peer's information to auth_info_t - */ - int ret; size_t i, j; if (info->raw_certificate_list != NULL) { @@ -98,32 +96,18 @@ int _gnutls_copy_certificate_auth_info(cert_auth_info_t info, gnutls_pcert_st * return GNUTLS_E_MEMORY_ERROR; } + info->cert_type = certs[0].type; + info->ncerts = ncerts; + for (i = 0; i < ncerts; i++) { - if (certs[i].cert.size > 0) { - ret = - _gnutls_set_datum(&info->raw_certificate_list[i], - certs[i].cert.data, - certs[i].cert.size); - if (ret < 0) { - gnutls_assert(); - goto clear; - } - } + info->raw_certificate_list[i].data = certs[i].cert.data; + info->raw_certificate_list[i].size = certs[i].cert.size; + certs[i].cert.data = NULL; + gnutls_pcert_deinit(&certs[i]); } - info->ncerts = ncerts; - info->cert_type = certs[0].type; + gnutls_free(certs); return 0; - - clear: - - for (j = 0; j < i; j++) - _gnutls_free_datum(&info->raw_certificate_list[j]); - - gnutls_free(info->raw_certificate_list); - info->raw_certificate_list = NULL; - - return ret; } /* returns 0 if the algo_to-check exists in the pk_algos list, @@ -837,7 +821,7 @@ _gnutls_proc_x509_server_crt(gnutls_session_t session, } ret = - _gnutls_copy_certificate_auth_info(info, + _gnutls_pcert_to_auth_info(info, peer_certificate_list, peer_certificate_list_size); if (ret < 0) { @@ -845,7 +829,7 @@ _gnutls_proc_x509_server_crt(gnutls_session_t session, goto cleanup; } - ret = 0; + return 0; cleanup: CLEAR_CERTS; |