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>
This commit is contained in:
Vasil Velichkov 2018-11-06 21:54:24 +02:00 committed by Anders Broman
parent 54c966b986
commit 9b6b36beae
1 changed files with 71 additions and 26 deletions

View File

@ -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);