diff options
-rw-r--r-- | epan/dissectors/packet-gssapi.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/epan/dissectors/packet-gssapi.c b/epan/dissectors/packet-gssapi.c index f7ce0c7ff0..9dd85f5e5c 100644 --- a/epan/dissectors/packet-gssapi.c +++ b/epan/dissectors/packet-gssapi.c @@ -368,16 +368,34 @@ dissect_gssapi_work(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, } else { tvbuff_t *oid_tvb_local; - oid_tvb_local = tvb_new_subset_remaining(gss_tvb, start_offset); - if (is_verifier) + if (is_verifier) { handle = oidvalue->wrap_handle; - else + if (handle != NULL) { + oid_tvb_local = tvb_new_subset_remaining(gss_tvb, start_offset); + len = call_dissector_with_data(handle, oid_tvb_local, pinfo, subtree, encrypt_info); + if (len == 0) + return_offset = tvb_captured_length(gss_tvb); + else + return_offset = start_offset + len; + } else { + proto_tree_add_item(subtree, hf_gssapi_auth_verifier, gss_tvb, offset, -1, ENC_NA); + return_offset = tvb_captured_length(gss_tvb); + } + } else { handle = oidvalue->handle; - len = call_dissector_with_data(handle, oid_tvb_local, pinfo, subtree, encrypt_info); - if (len == 0) - return_offset = tvb_captured_length(gss_tvb); - else - return_offset = start_offset + len; + if (handle != NULL) { + oid_tvb_local = tvb_new_subset_remaining(gss_tvb, start_offset); + len = call_dissector_with_data(handle, oid_tvb_local, pinfo, subtree, encrypt_info); + if (len == 0) + return_offset = tvb_captured_length(gss_tvb); + else + return_offset = start_offset + len; + } else { + proto_tree_add_item(subtree, hf_gssapi_auth_credentials, gss_tvb, offset, -1, ENC_NA); + return_offset = tvb_captured_length(gss_tvb); + } + } + goto done; /* We are finished here */ } } |