Show individual flavors in array. Dissect number of AUTH_UNIX aux gids.
Show AUTH_UNIX stamp in hex notation (like in RPC). Throw an fatal error when cannot continue parsing (this is because cb_sec_params does not contain length of the buffer, it has to be calculated based on the known data). --- epan/dissectors/packet-nfs.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/epan/dissectors/packet-nfs.c b/epan/dissectors/packet-nfs.c index e34b5b3f053b..9bb59ff18d96 100644 --- a/epan/dissectors/packet-nfs.c +++ b/epan/dissectors/packet-nfs.c @@ -893,6 +893,9 @@ static int ett_nfs4_maxops; static int ett_nfs4_maxreqs; static int ett_nfs4_streamchanattrs; static int ett_nfs4_rdmachanattrs; +static int ett_nfs4_sec_parms_array; +static int ett_nfs4_sec_parms_item; +static int ett_nfs4_gids; static int ett_nfs4_machinename; static int ett_nfs4_flavor; static int ett_nfs4_stamp; @@ -9701,28 +9704,42 @@ dissect_rpc_nfs_impl_id4(tvbuff_t *tvb, int offset, proto_tree *tree, const char static int -dissect_rpc_secparms4(tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_rpc_secparms4(tvbuff_t *tvb, int offset, proto_tree *parent_tree) { unsigned count, i; + int array_offset; + proto_tree *array_tree; + proto_item *array_item; + + array_offset = offset; + array_tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_nfs4_sec_parms_array, &array_item, "cb_sec_parms"); count = tvb_get_ntohl(tvb, offset); offset += 4; for (i = 0; i < count; i++) { + proto_item *item; + int item_offset = offset; + proto_tree *tree = proto_tree_add_subtree(array_tree, tvb, offset, 0, ett_nfs4_sec_parms_item, &item, "entry"); unsigned j, flavor = tvb_get_ntohl(tvb, offset); offset = dissect_rpc_uint32(tvb, tree, hf_nfs4_flavor, offset); switch (flavor) { + case AUTH_NULL: + break; case AUTH_UNIX: { unsigned count2; + proto_tree *tree2; offset = dissect_rpc_uint32(tvb, tree, hf_nfs4_stamp, offset); offset = dissect_nfs_utf8string(tvb, offset, tree, hf_nfs4_machinename, NULL); offset = dissect_rpc_uint32(tvb, tree, hf_nfs4_uid, offset); offset = dissect_rpc_uint32(tvb, tree, hf_nfs4_gid, offset); count2 = tvb_get_ntohl(tvb, offset); + tree2 = proto_tree_add_subtree_format(tree, tvb, offset, + 4+count2*4, ett_nfs4_gids, NULL, "auxiliary gids (%u)", count2); offset += 4; for (j = 0; j < count2; j++) { - offset = dissect_rpc_uint32(tvb, tree, hf_nfs4_gid, offset); + offset = dissect_rpc_uint32(tvb, tree2, hf_nfs4_gid, offset); } break; } @@ -9734,9 +9751,16 @@ dissect_rpc_secparms4(tvbuff_t *tvb, int offset, proto_tree *tree) offset = dissect_nfsdata(tvb, offset, tree, hf_nfs_data); break; default: - break; + /* Report fatal error as it is not possible to figure out item length and therefore + * not possible to continue parsing next item or continue parsing next packet. */ + THROW(ReportedBoundsError); } + + proto_item_set_len(item, offset - item_offset); } + + proto_item_set_len(array_item, offset - array_offset); + return offset; } @@ -14086,7 +14110,7 @@ proto_register_nfs(void) VALS(rpc_auth_flavor), 0, NULL, HFILL }}, { &hf_nfs4_stamp, { - "stamp", "nfs.stamp4", FT_UINT32, BASE_DEC, + "stamp", "nfs.stamp4", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }}, { &hf_nfs4_uid, { @@ -15021,6 +15045,9 @@ proto_register_nfs(void) &ett_nfs4_maxreqs, &ett_nfs4_streamchanattrs, &ett_nfs4_rdmachanattrs, + &ett_nfs4_sec_parms_array, + &ett_nfs4_sec_parms_item, + &ett_nfs4_gids, &ett_nfs4_machinename, &ett_nfs4_flavor, &ett_nfs4_stamp, -- 2.20.1 _______________________________________________ Wireshark-dev mailing list -- wireshark-dev@wireshark.org To unsubscribe send an email to wireshark-dev-le...@wireshark.org