aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
authorAlexis La Goutte <alexis.lagoutte@gmail.com>2013-12-24 15:15:43 +0000
committerAlexis La Goutte <alexis.lagoutte@gmail.com>2013-12-24 15:15:43 +0000
commitee6d040ebf4c20b284ad8fdefc9b14f3191e13b9 (patch)
treee645bb96990ffa728bb473aa539d68e2e405d50e /epan/dissectors
parentad5d1b910587d67affa085d668e8153a50c0b8d6 (diff)
From Dirk via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9589
Enhance SSL dissector : fix ssl_private_decrypt() free all gcrypt resources svn path=/trunk/; revision=54444
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-ssl-utils.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/epan/dissectors/packet-ssl-utils.c b/epan/dissectors/packet-ssl-utils.c
index 8cf0457ce5..ec79385952 100644
--- a/epan/dissectors/packet-ssl-utils.c
+++ b/epan/dissectors/packet-ssl-utils.c
@@ -1630,16 +1630,17 @@ ssl_private_decrypt(guint len, guchar* encr_data, SSL_PRIVATE_KEY* pk)
if (rc != 0) {
ssl_debug_printf("pcry_private_decrypt: can't build encr_sexp:%s \n",
gcry_strerror(rc));
- return 0;
+ decr_len = 0;
+ goto out;
}
/* pass it to libgcrypt */
rc = gcry_pk_decrypt(&s_plain, s_data, pk);
- gcry_sexp_release(s_data);
if (rc != 0)
{
ssl_debug_printf("pcry_private_decrypt: can't decrypt key:%s\n",
gcry_strerror(rc));
+ decr_len = 0;
goto out;
}
@@ -1659,7 +1660,8 @@ ssl_private_decrypt(guint len, guchar* encr_data, SSL_PRIVATE_KEY* pk)
if (decr_len > len) {
ssl_debug_printf("pcry_private_decrypt: decrypted data is too long ?!? (%" G_GSIZE_MODIFIER "u max %d)\n",
decr_len, len);
- return 0;
+ decr_len = 0;
+ goto out;
}
/* write plain text to encrypted data buffer */
@@ -1687,9 +1689,6 @@ ssl_private_decrypt(guint len, guchar* encr_data, SSL_PRIVATE_KEY* pk)
ssl_print_data("decrypted_unstrip_pre_master", decr_data_ptr, decr_len);
memmove(decr_data_ptr, &decr_data_ptr[rc], decr_len - rc);
decr_len -= rc;
-
-out:
- gcry_sexp_release(s_plain);
#else /* SSL_FAST */
rc = _gcry_rsa_decrypt(0, &text, &encr_mpi, pk,0);
gcry_mpi_print( GCRYMPI_FMT_USG, 0, 0, &decr_len, text);
@@ -1698,7 +1697,8 @@ out:
if (decr_len > len) {
ssl_debug_printf("pcry_private_decrypt: decrypted data is too long ?!? (%d max %d)\n",
decr_len, len);
- return 0;
+ decr_len = 0;
+ goto out;
}
/* write plain text to newly allocated buffer */
@@ -1707,7 +1707,8 @@ out:
text) != 0) {
ssl_debug_printf("pcry_private_decrypt: can't print decr data to mpi (size %d):%s\n",
decr_len, gcry_strerror(rc));
- return 0;
+ decr_len = 0;
+ goto out;
}
/* strip the padding*/
@@ -1725,6 +1726,10 @@ out:
memmove(decr_data_ptr, &decr_data_ptr[rc], decr_len - rc);
decr_len -= rc;
#endif /* SSL_FAST */
+out:
+ gcry_sexp_release(s_data);
+ gcry_sexp_release(s_plain);
+ gcry_mpi_release(encr_mpi);
gcry_mpi_release(text);
return (int) decr_len;
}