aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorVasil Velichkov <vvvelichkov@gmail.com>2018-11-06 21:54:24 +0200
committerAnders Broman <a.broman58@gmail.com>2018-11-09 05:51:44 +0000
commit9b6b36beaeb2f58a209943d95c05486b72c6907f (patch)
tree02a33e74f7868d3db8a9129505a4b801abd6e7af /epan
parent54c966b986ddc9b054436010606e29c4304a968e (diff)
isakmp: Free the UAT tables' records using a free callback
Change-Id: Ife44b225337e5c583c722ac62f711ed3ec9cf808 Reviewed-on: https://code.wireshark.org/review/30535 Reviewed-by: Peter Wu <peter@lekensteyn.nl> Petri-Dish: Peter Wu <peter@lekensteyn.nl> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-isakmp.c97
1 files changed, 71 insertions, 26 deletions
diff --git a/epan/dissectors/packet-isakmp.c b/epan/dissectors/packet-isakmp.c
index 33db92d314..f1aa7b2641 100644
--- a/epan/dissectors/packet-isakmp.c
+++ b/epan/dissectors/packet-isakmp.c
@@ -5830,27 +5830,6 @@ isakmp_cleanup_protocol(void) {
g_hash_table_destroy(defrag_next_payload_hash);
}
-static void
-isakmp_shutdown(void)
-{
- guint i;
- for (i = 0; i < num_ikev2_uat_data; i++) {
- ikev2_uat_data_t* data = &ikev2_uat_data[i];
- g_free(data->key.spii);
- g_free(data->key.spir);
- g_free(data->sk_ei);
- g_free(data->sk_er);
- g_free(data->sk_ai);
- g_free(data->sk_ar);
- }
-
- for (i = 0; i < num_ikev1_uat_data; i++) {
- ikev1_uat_data_key_t* data = &ikev1_uat_data[i];
- g_free(data->icookie);
- g_free(data->key);
- }
-}
-
UAT_BUFFER_CB_DEF(ikev1_users, icookie, ikev1_uat_data_key_t, icookie, icookie_len)
UAT_BUFFER_CB_DEF(ikev1_users, key, ikev1_uat_data_key_t, key, key_len)
@@ -5875,6 +5854,28 @@ static gboolean ikev1_uat_data_update_cb(void* p, char** err) {
return TRUE;
}
+static void*
+ikev1_uat_data_copy_cb(void *dest, const void *source, size_t len _U_)
+{
+ const ikev1_uat_data_key_t* o = (const ikev1_uat_data_key_t*)source;
+ ikev1_uat_data_key_t* d = (ikev1_uat_data_key_t*)dest;
+
+ d->icookie = (guchar *)g_memdup(o->icookie, o->icookie_len);
+ d->icookie_len = o->icookie_len;
+ d->key = (guchar *)g_memdup(o->key, o->key_len);
+ d->key_len = o->key_len;
+
+ return dest;
+}
+
+static void
+ikev1_uat_data_free_cb(void *r)
+{
+ ikev1_uat_data_key_t *rec = (ikev1_uat_data_key_t *)r;
+ g_free(rec->icookie);
+ g_free(rec->key);
+}
+
UAT_BUFFER_CB_DEF(ikev2_users, spii, ikev2_uat_data_t, key.spii, key.spii_len)
UAT_BUFFER_CB_DEF(ikev2_users, spir, ikev2_uat_data_t, key.spir, key.spir_len)
UAT_BUFFER_CB_DEF(ikev2_users, sk_ei, ikev2_uat_data_t, sk_ei, sk_ei_len)
@@ -5884,6 +5885,39 @@ UAT_BUFFER_CB_DEF(ikev2_users, sk_ai, ikev2_uat_data_t, sk_ai, sk_ai_len)
UAT_BUFFER_CB_DEF(ikev2_users, sk_ar, ikev2_uat_data_t, sk_ar, sk_ar_len)
UAT_VS_DEF(ikev2_users, auth_alg, ikev2_uat_data_t, guint, IKEV2_AUTH_HMAC_SHA1_96, IKEV2_AUTH_HMAC_SHA1_96_STR)
+static void*
+ikev2_uat_data_copy_cb(void *dest, const void *source, size_t len _U_)
+{
+ const ikev2_uat_data_t* o = (const ikev2_uat_data_t*)source;
+ ikev2_uat_data_t* d = (ikev2_uat_data_t*)dest;
+
+ d->key.spii = (guchar *)g_memdup(o->key.spii, o->key.spii_len);
+ d->key.spii_len = o->key.spii_len;
+
+ d->key.spir = (guchar *)g_memdup(o->key.spir, o->key.spir_len);
+ d->key.spir_len = o->key.spir_len;
+
+ d->encr_alg = o->encr_alg;
+ d->auth_alg = o->auth_alg;
+
+ d->sk_ei = (guchar *)g_memdup(o->sk_ei, o->sk_ei_len);
+ d->sk_ei_len = o->sk_ei_len;
+
+ d->sk_er = (guchar *)g_memdup(o->sk_er, o->sk_er_len);
+ d->sk_er_len = o->sk_er_len;
+
+ d->sk_ai = (guchar *)g_memdup(o->sk_ai, o->sk_ai_len);
+ d->sk_ai_len = o->sk_ai_len;
+
+ d->sk_ar = (guchar *)g_memdup(o->sk_ar, o->sk_ar_len);
+ d->sk_ar_len = o->sk_ar_len;
+
+ d->encr_spec = (ikev2_encr_alg_spec_t *)g_memdup(o->encr_spec, sizeof(ikev2_encr_alg_spec_t));
+ d->auth_spec = (ikev2_auth_alg_spec_t *)g_memdup(o->auth_spec, sizeof(ikev2_auth_alg_spec_t));
+
+ return dest;
+}
+
static gboolean ikev2_uat_data_update_cb(void* p, char** err) {
ikev2_uat_data_t *ud = (ikev2_uat_data_t *)p;
@@ -5938,6 +5972,18 @@ static gboolean ikev2_uat_data_update_cb(void* p, char** err) {
return TRUE;
}
+static void
+ikev2_uat_data_free_cb(void *r)
+{
+ ikev2_uat_data_t *rec = (ikev2_uat_data_t *)r;
+ g_free(rec->key.spii);
+ g_free(rec->key.spir);
+ g_free(rec->sk_ei);
+ g_free(rec->sk_er);
+ g_free(rec->sk_ai);
+ g_free(rec->sk_ar);
+}
+
void
proto_register_isakmp(void)
{
@@ -7260,7 +7306,6 @@ proto_register_isakmp(void)
expert_register_field_array(expert_isakmp, ei, array_length(ei));
register_init_routine(&isakmp_init_protocol);
register_cleanup_routine(&isakmp_cleanup_protocol);
- register_shutdown_routine(&isakmp_shutdown);
reassembly_table_register(&isakmp_cisco_reassembly_table,
&addresses_reassembly_table_functions);
reassembly_table_register(&isakmp_ike2_reassembly_table,
@@ -7277,9 +7322,9 @@ proto_register_isakmp(void)
&num_ikev1_uat_data,
UAT_AFFECTS_DISSECTION, /* affects dissection of packets, but not set of named fields */
"ChIKEv1DecryptionSection",
- NULL,
+ ikev1_uat_data_copy_cb,
ikev1_uat_data_update_cb,
- NULL,
+ ikev1_uat_data_free_cb,
NULL,
NULL,
ikev1_uat_flds);
@@ -7298,9 +7343,9 @@ proto_register_isakmp(void)
&num_ikev2_uat_data,
UAT_AFFECTS_DISSECTION, /* affects dissection of packets, but not set of named fields */
"ChIKEv2DecryptionSection",
- NULL,
+ ikev2_uat_data_copy_cb,
ikev2_uat_data_update_cb,
- NULL,
+ ikev2_uat_data_free_cb,
NULL,
NULL,
ikev2_uat_flds);