diff options
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-isakmp.c | 97 |
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); |