.add_subtree = add_subtree,
.data = data,
};
- void *old_private_data = di->private_data;
+ dcerpc_info old_di = *di;
header_field_info *hfinfo;
+ DISSECTOR_ASSERT(is_conformant || is_varying);
/* Make sure this really is a string field. */
hfinfo = proto_registrar_get_nth(hfindex);
DISSECTOR_ASSERT_FIELD_TYPE(hfinfo, FT_STRING);
- di->private_data = &state;
- if (is_conformant && is_varying) {
- offset = dissect_ndr_ucvarray_block(tvb, offset, pinfo,
- tree, di, drep,
- dcerpc_ndr_string_uarray_blk);
- } else if (is_conformant) {
- offset = dissect_ndr_ucarray_block(tvb, offset, pinfo,
- tree, di, drep,
- dcerpc_ndr_string_uarray_blk);
- } else if (is_varying) {
- offset = dissect_ndr_uvarray_block(tvb, offset, pinfo,
- tree, di, drep,
- dcerpc_ndr_string_uarray_blk);
- } else {
- ws_assert_not_reached();
+ if (di->conformant_run) {
+ return offset;
}
- di->private_data = old_private_data;
+
+ old_di = *di;
+ di->private_data = &state;
+ di->conformant_run = 1;
+ offset = dissect_ndr_c_and_or_v_array_core(tvb, offset, pinfo,
+ tree, di, drep,
+ is_conformant, is_varying,
+ NULL, /* fnct_bytes */
+ dcerpc_ndr_string_uarray_blk);
+ di->conformant_run = 0;
+ offset = dissect_ndr_c_and_or_v_array_core(tvb, offset, pinfo,
+ tree, di, drep,
+ is_conformant, is_varying,
+ NULL, /* fnct_bytes */
+ dcerpc_ndr_string_uarray_blk);
+ *di = old_di;
return offset;
}