diff --git a/epan/dissectors/packet-mswsp.c b/epan/dissectors/packet-mswsp.c index 421713067b..295192a0ab 100644 --- a/epan/dissectors/packet-mswsp.c +++ b/epan/dissectors/packet-mswsp.c @@ -359,6 +359,7 @@ static int SMB2 = 2; void proto_reg_handoff_mswsp(void); +static expert_field ei_mswsp_invalid_variant_type = EI_INIT; static expert_field ei_missing_msg_context = EI_INIT; static expert_field ei_mswsp_msg_cpmsetbinding_ccolumns = EI_INIT; @@ -3068,7 +3069,7 @@ static int parse_lcid(tvbuff_t *tvb, int offset, proto_tree *parent_tree, const /*****************************************************************************************/ /* 2.2.1.1 CBaseStorageVariant */ -static int parse_CBaseStorageVariant(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CBaseStorageVariant *value, const char *text); +static int parse_CBaseStorageVariant(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CBaseStorageVariant *value, const char *text); /* 2.2.1.2 CFullPropSpec */ static int parse_CFullPropSpec(tvbuff_t *tvb, int offset, proto_tree *tree, proto_tree *pad_tree, struct CFullPropSpec *v, const char *fmt, ...); @@ -3080,10 +3081,10 @@ static int parse_CContentRestriction(tvbuff_t *tvb, int offset, proto_tree *pare static int parse_CNatLanguageRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CNatLanguageRestriction *v, const char *fmt, ...); /* 2.2.1.6 CNodeRestriction */ -static int parse_CNodeRestriction(tvbuff_t *tvb, int offset, proto_tree *tree, proto_tree *pad_tree, struct CNodeRestriction *v, const char* fmt, ...); +static int parse_CNodeRestriction(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *tree, proto_tree *pad_tree, struct CNodeRestriction *v, const char* fmt, ...); /* 2.2.1.7 CPropertyRestriction */ -static int parse_CPropertyRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CPropertyRestriction *v, const char *fmt, ...); +static int parse_CPropertyRestriction(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CPropertyRestriction *v, const char *fmt, ...); /* 2.2.1.8 CReuseWhere */ static int parse_CReuseWhere(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, struct CReuseWhere *v, const char *fmt, ...); @@ -3092,27 +3093,27 @@ static int parse_CReuseWhere(tvbuff_t *tvb, int offset, proto_tree *parent_tree, static int parse_CSort(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, const char *fmt, ...); /* 2.2.1.12 CCoercionRestriction */ -static int parse_CCoercionRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CCoercionRestriction *v, const char *fmt, ...); +static int parse_CCoercionRestriction(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CCoercionRestriction *v, const char *fmt, ...); /* 2.2.1.16 CRestrictionArray */ -static int parse_CRestrictionArray(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); +static int parse_CRestrictionArray(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); /* 2.2.1.17 CRestriction */ -static int parse_CRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CRestriction *v, const char *fmt, ...); +static int parse_CRestriction(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CRestriction *v, const char *fmt, ...); /* 2.2.1.18 CColumnSet */ static int parse_CColumnSet(tvbuff_t *tvb, int offset, proto_tree *tree, const char *fmt, ...); /* 2.2.1.20 CCategorizationSpec */ -static int parse_CCategorizationSpec(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); +static int parse_CCategorizationSpec(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); /* 2.2.1.21 CCategSpec */ -static int parse_CCategSpec(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); +static int parse_CCategSpec(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); /* 2.2.1.22 CRangeCategSpec */ -static int parse_CRangeCategSpec(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); +static int parse_CRangeCategSpec(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); /* 2.2.1.23 RANGEBOUNDARY */ -static int parse_RANGEBOUNDARY(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); +static int parse_RANGEBOUNDARY(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); /* 2.2.1.24 CAggregSet */ static int parse_CAggregSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); @@ -3127,19 +3128,19 @@ static int parse_CSortAggregSet(tvbuff_t *tvb, int offset, proto_tree *parent_tr static int parse_CAggregSortKey(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); /* 2.2.1.28 CInGroupSortAggregSets */ -static int parse_CInGroupSortAggregSets(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); +static int parse_CInGroupSortAggregSets(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); /* 2.2.1.29 CInGroupSortAggregSet */ -static int parse_CInGroupSortAggregSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); +static int parse_CInGroupSortAggregSet(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); /* 2.2.1.30 CDbColId */ static int parse_CDbColId(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *text); /* 2.2.1.31 CDbProp */ -static int parse_CDbProp(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct GuidPropertySet *propset, const char *fmt, ...); +static int parse_CDbProp(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct GuidPropertySet *propset, const char *fmt, ...); /* 2.2.1.32 CDbPropSet */ -static int parse_CDbPropSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); +static int parse_CDbPropSet(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); /* 2.2.1.33 CPidMapper */ static int parse_CPidMapper(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); @@ -3157,7 +3158,7 @@ static int parse_CRowsetProperties(tvbuff_t *tvb, int offset, proto_tree *parent static int parse_CSortSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...); /* 2.2.1.44 CTableColumn */ -static int parse_CTableColumn(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CTableColumn *col, const char *fmt, ...); +static int parse_CTableColumn(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CTableColumn *col, const char *fmt, ...); /* @@ -3231,11 +3232,11 @@ static int parse_CSortSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, pr return offset; } -static int parse_CTableColumn(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CTableColumn *col, const char *fmt, ...) +static int parse_CTableColumn(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CTableColumn *col, const char *fmt, ...) { - proto_item *item; + proto_item *item, *ti_type; proto_tree *tree; va_list ap; struct vtype_data *type; @@ -3266,8 +3267,14 @@ static int parse_CTableColumn(tvbuff_t *tvb, int offset, proto_tree *parent_tree } } type = vType_get_type(vtype_val); - DISSECTOR_ASSERT(type != NULL); - proto_tree_add_string_format_value(tree, hf_mswsp_ctablecolumn_vtype, tvb, offset, 4, type->str, "%s%s", type->str, modifier); + if (type == NULL) { + /* + * Not a valid type. + */ + ti_type = proto_tree_add_string(tree, hf_mswsp_ctablecolumn_vtype, tvb, offset, 4, "Unknown CTableColumn type"); + expert_add_info(pinfo, ti_type, &ei_mswsp_invalid_variant_type); + } else + proto_tree_add_string_format_value(tree, hf_mswsp_ctablecolumn_vtype, tvb, offset, 4, type->str, "%s%s", type->str, modifier); offset += 4; used = tvb_get_guint8(tvb, offset); @@ -3487,7 +3494,7 @@ static int parse_relop(tvbuff_t *tvb, int offset, proto_tree *tree, guint32 *re } return offset + 4; } -static int parse_CPropertyRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CPropertyRestriction *v, const char *fmt, ...) +static int parse_CPropertyRestriction(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CPropertyRestriction *v, const char *fmt, ...) { proto_tree *tree; proto_item *item; @@ -3505,7 +3512,7 @@ static int parse_CPropertyRestriction(tvbuff_t *tvb, int offset, proto_tree *par offset = parse_CFullPropSpec(tvb, offset, tree, pad_tree, &v->property, "Property"); - offset = parse_CBaseStorageVariant(tvb, offset, tree, pad_tree, &v->prval, "prval"); + offset = parse_CBaseStorageVariant(tvb, pinfo, offset, tree, pad_tree, &v->prval, "prval"); offset = parse_padding(tvb, offset, 4, pad_tree, "padding_lcid"); @@ -3517,7 +3524,7 @@ static int parse_CPropertyRestriction(tvbuff_t *tvb, int offset, proto_tree *par return offset; } -static int parse_CCoercionRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CCoercionRestriction *v, const char *fmt, ...) +static int parse_CCoercionRestriction(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CCoercionRestriction *v, const char *fmt, ...) { proto_tree *tree; proto_item *item; @@ -3535,7 +3542,7 @@ static int parse_CCoercionRestriction(tvbuff_t *tvb, int offset, proto_tree *par offset += 4; - offset = parse_CRestriction(tvb, offset, tree, pad_tree, &v->child, "child"); + offset = parse_CRestriction(tvb, pinfo, offset, tree, pad_tree, &v->child, "child"); proto_item_set_end(item, tvb, offset); return offset; @@ -3732,7 +3739,7 @@ static int parse_rType(tvbuff_t *tvb, int offset, proto_tree *tree, enum rType * return offset + 4; } -static int parse_CRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CRestriction *v, const char *fmt, ...) +static int parse_CRestriction(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct CRestriction *v, const char *fmt, ...) { proto_tree *tree; proto_item *item; @@ -3761,18 +3768,18 @@ static int parse_CRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree case RTProximity: case RTPhrase: { v->u.RTAnd = EP_ALLOC(struct CNodeRestriction); - offset = parse_CNodeRestriction(tvb, offset, tree, pad_tree, v->u.RTAnd, "CNodeRestriction"); + offset = parse_CNodeRestriction(tvb, pinfo, offset, tree, pad_tree, v->u.RTAnd, "CNodeRestriction"); break; } case RTNot: { v->u.RTNot = EP_ALLOC(struct CRestriction); - offset = parse_CRestriction(tvb, offset, tree, pad_tree, + offset = parse_CRestriction(tvb, pinfo, offset, tree, pad_tree, v->u.RTNot, "CRestriction"); break; } case RTProperty: { v->u.RTProperty = EP_ALLOC(struct CPropertyRestriction); - offset = parse_CPropertyRestriction(tvb, offset, tree, pad_tree, + offset = parse_CPropertyRestriction(tvb, pinfo, offset, tree, pad_tree, v->u.RTProperty, "CPropertyRestriction"); break; } @@ -3780,7 +3787,7 @@ static int parse_CRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree case RTCoerce_Multiply: case RTCoerce_Absolute: { v->u.RTCoerce_Add = EP_ALLOC(struct CCoercionRestriction); - offset = parse_CCoercionRestriction(tvb, offset, tree, pad_tree, + offset = parse_CCoercionRestriction(tvb, pinfo, offset, tree, pad_tree, v->u.RTCoerce_Add, "CCoercionRestriction"); break; } @@ -3810,7 +3817,7 @@ static int parse_CRestriction(tvbuff_t *tvb, int offset, proto_tree *parent_tree return offset; } -static int parse_CRestrictionArray(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...) +static int parse_CRestrictionArray(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...) { guint8 present, count; @@ -3840,14 +3847,14 @@ static int parse_CRestrictionArray(tvbuff_t *tvb, int offset, proto_tree *parent for (i=0; icNode; i++) { struct CRestriction r; ZERO_STRUCT(r); - offset = parse_CRestriction(tvb, offset, tree, pad_tree, &r, "paNode[%u]", i); + offset = parse_CRestriction(tvb, pinfo, offset, tree, pad_tree, &r, "paNode[%u]", i); offset = parse_padding(tvb, offset, 4, tree, "padding_paNode[%u]", i); /*at begin or end of loop ????*/ } @@ -4208,117 +4215,7 @@ static const char *str_CBaseStorageVariant(struct CBaseStorageVariant *value, gb return wmem_strbuf_get_str(strbuf); } -static int parse_vType(tvbuff_t *tvb, int offset, guint16 *vtype) -{ - guint16 tmp_vtype = tvb_get_letohs(tvb, offset); - guint16 modifier = tmp_vtype & 0xFF00; - - switch (tmp_vtype & 0xFF) { - case VT_EMPTY: - *vtype = VT_EMPTY; - break; - case VT_NULL: - *vtype = VT_NULL; - break; - case VT_I2: - *vtype = VT_I2; - break; - case VT_I4: - *vtype = VT_I4; - break; - case VT_R4: - *vtype = VT_R4; - break; - case VT_R8: - *vtype = VT_R8; - break; - case VT_CY: - *vtype = VT_CY; - break; - case VT_DATE: - *vtype = VT_DATE; - break; - case VT_BSTR: - *vtype = VT_BSTR; - break; - case VT_ERROR: - *vtype = VT_ERROR; - break; - case VT_BOOL: - *vtype = VT_BOOL; - break; - case VT_VARIANT: - *vtype = VT_VARIANT; - break; - case VT_DECIMAL: - *vtype = VT_DECIMAL; - break; - case VT_I1: - *vtype = VT_I1; - break; - case VT_UI1: - *vtype = VT_UI1; - break; - case VT_UI2: - *vtype = VT_UI2; - break; - case VT_UI4: - *vtype = VT_UI4; - break; - case VT_I8: - *vtype = VT_I8; - break; - case VT_UI8: - *vtype = VT_UI8; - break; - case VT_INT: - *vtype = VT_INT; - break; - case VT_UINT: - *vtype = VT_UINT; - break; - case VT_LPSTR: - *vtype = VT_LPSTR; - break; - case VT_LPWSTR: - *vtype = VT_LPWSTR; - break; - case VT_COMPRESSED_LPWSTR: - *vtype = VT_COMPRESSED_LPWSTR; - break; - case VT_FILETIME: - *vtype = VT_FILETIME; - break; - case VT_BLOB: - *vtype = VT_BLOB; - break; - case VT_BLOB_OBJECT: - *vtype = VT_BLOB_OBJECT; - break; - case VT_CLSID: - *vtype = VT_CLSID; - break; - default: - DISSECTOR_ASSERT(FALSE); - break; - } - if (modifier) { - switch (modifier) { - case VT_VECTOR: - *vtype |= VT_VECTOR; - break; - case VT_ARRAY: - *vtype |= VT_ARRAY; - break; - default: - DISSECTOR_ASSERT(FALSE); - break; - } - } - return offset + 2; -} - -static int parse_CBaseStorageVariant(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, struct CBaseStorageVariant *value, const char *text) +static int parse_CBaseStorageVariant(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree _U_, struct CBaseStorageVariant *value, const char *text) { int i, len; proto_item *ti, *ti_type, *ti_val; @@ -4329,9 +4226,19 @@ static int parse_CBaseStorageVariant(tvbuff_t *tvb, int offset, proto_tree *pare tree = proto_tree_add_subtree(parent_tree, tvb, offset, 0, ett_CBaseStorageVariant, &ti, text); - parse_vType(tvb, offset, &value->vType); - value->type = vType_get_type(value->vType); - DISSECTOR_ASSERT(value->type != NULL); + value->vType = tvb_get_letohs(tvb, offset); + value->type = vType_get_type(value->vType & 0xFF); + if (value->type == NULL) { + /* + * Not a valid type. + */ + ti_type = proto_tree_add_string(tree, hf_mswsp_cbasestorvariant_vtype, tvb, offset, 2, "Unknown CBaseStorageVariant type"); + offset += 2; + expert_add_info(pinfo, ti_type, &ei_mswsp_invalid_variant_type); + + THROW_MESSAGE(ReportedBoundsError, "Unknown CBaseStorageVariant type"); + return offset; + } ti_type = proto_tree_add_string(tree, hf_mswsp_cbasestorvariant_vtype, tvb, offset, 2, value->type->str); offset += 2; @@ -4452,7 +4359,7 @@ static int parse_CDbColId(tvbuff_t *tvb, int offset, proto_tree *parent_tree, pr return offset; } -static int parse_CDbProp(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct GuidPropertySet *propset, const char *fmt, ...) +static int parse_CDbProp(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, struct GuidPropertySet *propset, const char *fmt, ...) { static const value_string EMPTY_VS[] = {{0, NULL}}; const value_string *vs = (propset && propset->id_map) ? propset->id_map : EMPTY_VS; @@ -4485,7 +4392,7 @@ static int parse_CDbProp(tvbuff_t *tvb, int offset, proto_tree *parent_tree, pro offset = parse_CDbColId(tvb, offset, tree, pad_tree, "colid"); - offset = parse_CBaseStorageVariant(tvb, offset, tree, pad_tree, &value, "vValue"); + offset = parse_CBaseStorageVariant(tvb, pinfo, offset, tree, pad_tree, &value, "vValue"); str = str_CBaseStorageVariant(&value, TRUE); proto_item_append_text(item, " %s", str); @@ -4494,7 +4401,7 @@ static int parse_CDbProp(tvbuff_t *tvb, int offset, proto_tree *parent_tree, pro return offset; } -static int parse_CDbPropSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...) +static int parse_CDbPropSet(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, proto_tree *pad_tree, const char *fmt, ...) { int i, num; e_guid_t guid; @@ -4530,14 +4437,14 @@ static int parse_CDbPropSet(tvbuff_t *tvb, int offset, proto_tree *parent_tree, for (i = 0; ivtype & 0x00FF)); wmem_strbuf_t *strbuf; - DISSECTOR_ASSERT(vt_list_type != NULL); offset = parse_CRowVariantArrayInfo(tvb, offset, tree, is_64bit, variant); if (is_64bit) { buf_offset = @@ -5335,10 +5239,10 @@ static int parse_VariantColVector(tvbuff_t *tvb, int offset, proto_tree *tree, g return offset; } -static int parse_VariantCol(tvbuff_t *tvb, int offset, proto_tree *parent_tree, guint64 base_address, guint32 length _U_, gboolean is_64bit, struct CRowVariant *variant, const char *fmt, ...) +static int parse_VariantCol(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, guint64 base_address, guint32 length _U_, gboolean is_64bit, struct CRowVariant *variant, const char *fmt, ...) { proto_tree *tree; - proto_item *item; + proto_item *item, *ti_type; va_list ap; struct vtype_data *vt_type; @@ -5354,8 +5258,6 @@ static int parse_VariantCol(tvbuff_t *tvb, int offset, proto_tree *parent_tree, variant->vtype = tvb_get_letohs(tvb, offset); vt_type = vType_get_type((enum vType)variant->vtype); - DISSECTOR_ASSERT(vt_type != NULL); - vtype_high = (variant->vtype & 0xFF00); if (vtype_high) { if (vtype_high == VT_VECTOR) { @@ -5367,6 +5269,17 @@ static int parse_VariantCol(tvbuff_t *tvb, int offset, proto_tree *parent_tree, } } + if (vt_type == NULL) { + /* + * Not a valid type. + */ + ti_type = proto_tree_add_string(tree, hf_mswsp_ctablecolumn_vtype, tvb, offset, 4, "Unknown variant column type"); + expert_add_info(pinfo, ti_type, &ei_mswsp_invalid_variant_type); + offset += 2; + + THROW_FORMATTED(ReportedBoundsError, "Unknown variant column type%s", modifier); + return offset; + } proto_tree_add_string_format_value(tree, hf_mswsp_rowvariant_vtype, tvb, offset, 2, vt_type->str, "%s%s", vt_type->str, modifier); offset += 2; @@ -5382,7 +5295,7 @@ static int parse_VariantCol(tvbuff_t *tvb, int offset, proto_tree *parent_tree, if (vtype_high == VT_VECTOR || vtype_high == VT_ARRAY) { offset = parse_VariantColVector(tvb, offset, tree, base_address, - is_64bit, variant); + is_64bit, variant, vt_type); } else { wmem_strbuf_t *strbuf = wmem_strbuf_new(wmem_packet_scope(), ""); if (size != -1) { @@ -5421,7 +5334,7 @@ static int parse_VariantCol(tvbuff_t *tvb, int offset, proto_tree *parent_tree, return offset; } -static int parse_RowsBufferCol(tvbuff_t *tvb, int offset, guint32 row, guint32 col, struct CPMSetBindingsIn *bindingsin, struct rows_data *rowsin, gboolean b_is_64bit, proto_tree *parent_tree, const char *fmt, ...) +static int parse_RowsBufferCol(tvbuff_t *tvb, packet_info *pinfo, int offset, guint32 row, guint32 col, struct CPMSetBindingsIn *bindingsin, struct rows_data *rowsin, gboolean b_is_64bit, proto_tree *parent_tree, const char *fmt, ...) { proto_tree *tree; proto_item *item; @@ -5463,13 +5376,13 @@ static int parse_RowsBufferCol(tvbuff_t *tvb, int offset, guint32 row, guint32 c len = tvb_get_letohs(tvb, buf_offset + pcol->lengthoffset) - pcol->valuesize; } if (pcol->vtype == VT_VARIANT) { - parse_VariantCol(tvb, tmp_offset, tree, base_address, len, b_is_64bit, &variant, "CRowVariant"); + parse_VariantCol(tvb, pinfo, tmp_offset, tree, base_address, len, b_is_64bit, &variant, "CRowVariant"); } } return offset; } -static int parse_RowsBuffer(tvbuff_t *tvb, int offset, guint32 num_rows, struct CPMSetBindingsIn *bindingsin, struct rows_data *rowsin, gboolean is64bit, proto_tree *parent_tree, const char *fmt, ...) +static int parse_RowsBuffer(tvbuff_t *tvb, packet_info *pinfo, int offset, guint32 num_rows, struct CPMSetBindingsIn *bindingsin, struct rows_data *rowsin, gboolean is64bit, proto_tree *parent_tree, const char *fmt, ...) { proto_tree *tree; proto_item *item; @@ -5488,7 +5401,7 @@ static int parse_RowsBuffer(tvbuff_t *tvb, int offset, guint32 num_rows, struct proto_tree *row_tree; row_tree = proto_tree_add_subtree_format(tree, tvb, offset, 0, ett_GetRowsRow, NULL, "Row[%d]", num); for (col = 0; col < bindingsin->ccolumns; col++) { - parse_RowsBufferCol(tvb, offset, num, col, bindingsin, rowsin, is64bit, row_tree, "Col[%d]", col); + parse_RowsBufferCol(tvb, pinfo, offset, num, col, bindingsin, rowsin, is64bit, row_tree, "Col[%d]", col); } } return offset; @@ -5557,11 +5470,11 @@ static int dissect_CPMConnect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *par offset = parse_padding(tvb, offset, 8, pad_tree, "_paddingcPropSets"); - offset = parse_PropertySetArray(tvb, offset, blob_size1_off, tree, pad_tree, "PropSets"); + offset = parse_PropertySetArray(tvb, pinfo, offset, blob_size1_off, tree, pad_tree, "PropSets"); offset = parse_padding(tvb, offset, 8, pad_tree, "paddingExtPropset"); - offset = parse_PropertySetArray(tvb, offset, blob_size2_off, tree, pad_tree, "ExtPropset"); + offset = parse_PropertySetArray(tvb, pinfo, offset, blob_size2_off, tree, pad_tree, "ExtPropset"); offset = parse_padding(tvb, offset, 8, pad_tree, "???"); @@ -5616,7 +5529,7 @@ static int dissect_CPMCreateQuery(tvbuff_t *tvb, packet_info *pinfo, proto_tree offset += 1; if (CRestrictionPresent) { - offset = parse_CRestrictionArray(tvb, offset, tree, pad_tree, "RestrictionArray"); + offset = parse_CRestrictionArray(tvb, pinfo, offset, tree, pad_tree, "RestrictionArray"); } CSortSetPresent = tvb_get_guint8(tvb, offset); @@ -5625,7 +5538,7 @@ static int dissect_CPMCreateQuery(tvbuff_t *tvb, packet_info *pinfo, proto_tree if (CSortSetPresent) { offset = parse_padding(tvb, offset, 4, tree, "paddingCSortSetPresent"); - offset = parse_CInGroupSortAggregSets(tvb, offset, tree, pad_tree, "GroupSortAggregSets"); + offset = parse_CInGroupSortAggregSets(tvb, pinfo, offset, tree, pad_tree, "GroupSortAggregSets"); } @@ -5641,7 +5554,7 @@ static int dissect_CPMCreateQuery(tvbuff_t *tvb, packet_info *pinfo, proto_tree proto_tree_add_uint(tree, hf_mswsp_msg_cpmcreatequery_ccateg_count, tvb, offset, 4, count); offset += 4; for (i=0; icbreserved, pad_tree, "paddingRows"); - parse_RowsBuffer(tvb, offset, num_rows, bindingsin, rowsin, b_64bit_mode, tree, "Rows"); + parse_RowsBuffer(tvb, pinfo, offset, num_rows, bindingsin, rowsin, b_64bit_mode, tree, "Rows"); } else { gint nbytes = tvb_reported_length_remaining(tvb, offset); proto_tree_add_expert_format(tree, pinfo, &ei_missing_msg_context, tvb, offset, nbytes, "Undissected %d bytes (due to missing preceding msg(s))", nbytes); @@ -5950,7 +5863,7 @@ static int dissect_CPMSetBindings(tvbuff_t *tvb, packet_info *pinfo, proto_tree sizeof(struct CTableColumn) * num); for (n=0; n